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. VMware如何进入安全模式

    VMware进入安全模式和物理机一样:使光标处于在虚拟机中激活状态,启动系统时不停按F8即可. 安全模式--只加载必要的驱动和进程:在cmd可以看到部份命令不能执行或命令功能不能完全实现. 网络安全模 ...

  2. struts项目部署在Tomca上在断网情况下启动报错

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6015693.html 前段时间,项目部署到现场后,反馈Tomcat能正常启动,但是项目有时访问不了也不报错. ...

  3. Mybatis排序无效问题解决

    在 mybatis 的 xml中,为一个SQL语句配置order by 子句时,需要这个排序的字段是前端传递过来的,而且排序的顺序(升序 OR 降序)也是由前端传递过来的.对于这种需求,我起初写成了下 ...

  4. css 解决fixed 布局下不能滚动的问题

    如果我们布局的是后是fixed并且想要高度为100%的时候,我们一般会这样设置: div { display:fixed; height:%; overflow:scroll; } 但是这样并不会出现 ...

  5. 读入excle

    可以输出到csv(逗号间隔,具体搜索csv格式). csv可以在excel中直接导入. 也可以用system函数调用ssconvert从csv转xlsx:system("ssconvert ...

  6. struts访问

    struts基本工程结构: 1. struts.xml支持语法提示;2. struts.xml配置常量, 用来覆盖struts.properties中的默认常量配置  一般情况下, 这个配置放在str ...

  7. 项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved 解决方法

    Error: The import javax.servlet cannot be resolved The import javax.servlet.http.HttpServletRequest ...

  8. node(2) EventEmitter类 事件队列 事件和error事件方法

    事件队列的核心:事件触发与事件监听器功能的封装. // 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var e ...

  9. Cracking The Coding Interview5.1

    //You are given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set a ...

  10. 深入理解java虚拟机---虚拟机工具jps与jstat(十四)

    jps-java process status jps类似于linux的ps命令,用于查看进程. JPS 名称: jps - Java Virtual Machine Process Status T ...