1321: 营救公主

时间限制: 1 Sec  内存限制: 128 MB
提交: 156  解决: 37
[提交][状态][讨论版]

题目描述

DSKer今天又做梦了,他的睡眠质量一直很差。他梦见他化身骑士(不存在),去营救公主。
公主被困在一个迷宫里。迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了救出公主,DSKer必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,DSKer就必须找全三把钥匙才能打开A门。
现在请你编写一个程序来告诉DSKer,他能不能顺利救出公主。

输入

多组测试数据。
每组测试数据的第一行包含了两个整数M,N(1<N,M<=20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
.表示可以走的路
S:表示DSKer的出发点
G表示公主的位置
X表示这里有墙,DSKer无法进入或者穿过。
A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
注意DSKer只能在迷宫里向上下左右四个方向移动。
最后,输入0 0表示输入结束。

输出

每组数据输出一个YES表示DSKer能救出公主,输出NO表示他不能救出公主。

样例输入

4 4
S.X.
a.X.
..XG
....
3 4
S.Xa
.aXB
b.AG
0 0

样例输出

YES
NO
 // key[] : 钥匙的总共个数
// num[] : 每次搜索能够得到的钥匙数
// isok[]: 能否得到所有的钥匙数
// 思路: 反复搜索,直到当地图无法改变(有一个大门可以解锁)或者可以到达重点
#include <bits/stdc++.h>
using namespace std;
const int N=;
char str[N][N];
bool visit[N][N];
int key[],num[];
bool isok[];
int n,m;
int s_x,s_y;
bool flag,change;
int dx[]={,,-,};
int dy[]={,-,,};
bool iskey (char c) {
if (c>='a'&&c<='e') return ;
return ;
}
bool isok1(int x,int y) {
if (x>=&&x<=n&&y>=&&y<=m&&str[x][y]!='X')
return ;
return ;
}
bool dfs (int x,int y) {
visit[x][y]=;
if (str[x][y]=='G') return ;
for (int i=;i<;i++) {
int tx=x+dx[i];
int ty=y+dy[i];
if (isok1(tx,ty)&&!visit[tx][ty]) {
if (str[tx][ty]>='A'&&str[tx][ty]<='E') {
if (isok[str[tx][ty]-'A']&&dfs(tx,ty))
return ;
}
else {
if ( iskey(str[tx][ty]) )
num[str[tx][ty]-'a']++; //小错误不要犯 (tx,ty)写成(x,y)
if (dfs(tx,ty)) return ;
}
}
}
return ;
}
int main ()
{
while (~scanf ("%d %d\n",&n,&m)&&n&&m) {
memset (isok,,sizeof(isok));
memset (key,,sizeof(key));
for (int i=;i<=n;i++) {
gets(str[i]+);
for (int j=;j<=m;j++) {
if (str[i][j]=='S') {
s_x=i;
s_y=j;
}
if (iskey(str[i][j]))
key[str[i][j]-'a']++;
}
}
flag=;
while () {
change=;
memset (visit,,sizeof(visit));
memset (num,,sizeof(num));
if (dfs(s_x,s_y)) {
flag=; break;
}
for (int i=;i<;i++) {
if (key[i]>&&key[i]==num[i])
if (!isok[i]) {
change=;
isok[i]=;
}
}
if (!change) break;
}
if (flag) puts("YES");
else puts("NO");
}
return ;
}

继续加油。。。。。做题总是会想起你。mt

xdoj1321----简单搜索的更多相关文章

  1. ElasticSearch 5学习(4)——简单搜索笔记

    空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...

  2. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  3. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  4. solr简单搜索案例

    solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...

  5. 和我一起打造个简单搜索之SpringDataElasticSearch入门

    网上大多通过 java 操作 es 使用的都是 TransportClient,而介绍使用 SpringDataElasticSearch 的文章相对比较少,笔者也是摸索了许久,接下来本文介绍 Spr ...

  6. 和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮

    前面几篇文章详细讲解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 来完成搜索查询,但是搜索一般都会有搜索关键字高亮的功能,今天我们把它给加上. 系列文 ...

  7. 和我一起打造个简单搜索之Logstash实时同步建立索引

    用过 Solr 的朋友都知道,Solr 可以直接在配置文件中配置数据库连接从而完成索引的同步创建,但是 ElasticSearch 本身并不具备这样的功能,那如何建立索引呢?方法其实很多,可以使用 J ...

  8. 和我一起打造个简单搜索之IK分词以及拼音分词

    elasticsearch 官方默认的分词插件,对中文分词效果不理想,它是把中文词语分成了一个一个的汉字.所以我们引入 es 插件 es-ik.同时为了提升用户体验,引入 es-pinyin 插件.本 ...

  9. 和我一起打造个简单搜索之ElasticSearch集群搭建

    我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌.尺寸.适用季节.价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品. 站内搜索对 ...

  10. 和我一起打造个简单搜索之ElasticSearch入门

    本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...

随机推荐

  1. python3- __slots__

    Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ = ('name' ...

  2. vue-cli webpack全局引入jquery

    1.首先在package.json里加入, dependencies:{ "jquery" : "^2.2.3" } 2.安装依赖 npm install jq ...

  3. install sz rz linux

    1◆ ready 2◆ controller component   Xshell 注册码:690313-111999-999313 Xftp 注册码:101210-450789-147200   3 ...

  4. Java中的equals和==的差别 以及Java中等价性和同一性的讨论

    ==对基本数据类型比较的是值,对引用类型比较的是地址 equals()比较的是对象的数据的引用 等价性原理: 自反性    x.equals(x)为true 对称性    x.equals(y) 为t ...

  5. jquery插件artTxtCount输入字数限制,并提示剩余字数

    工作中用到,需要批量处理下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  6. 栈回溯简单实现(x86)

    0x01  栈简介  首先局部变量的分配释放是通过调整栈指针实现的,栈为函数调用和定义局部变量提供了一块简单易用的空间,定义在栈上的变量不必考虑内存申请和释放.只要调整栈指针就可以分配和释放内存.   ...

  7. U盘如何去除写保护

    用一个简单而粗暴的方法去除U盘写保护: www.upantool.com/hfxf/xiufu//FormatTool.html#softdown 没有比这个更牛的软件了.

  8. oracle截取字符串区间段的一部分字符串

    Oracle SQL中实现indexOf和lastIndexOf功能,substr和instr用法 博客分类: oracle PL/SQL instrsubstrlastindexofindexofo ...

  9. L290 英语中级班-3月上

    1元音饱满度 a [ei] name gamee [i:] he she mei [ai] fine likeo [ou] go homeu [ u:] use blue 2口音适应 刚开始说时,慢点 ...

  10. 合并k个有序数组

    给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为n*k的数组保存最后的结果创建一个大小为k的最小 ...