xdoj1321----简单搜索
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----简单搜索的更多相关文章
- ElasticSearch 5学习(4)——简单搜索笔记
空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...
- nyoj 284 坦克大战 简单搜索
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...
- solr简单搜索案例
solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...
- 和我一起打造个简单搜索之SpringDataElasticSearch入门
网上大多通过 java 操作 es 使用的都是 TransportClient,而介绍使用 SpringDataElasticSearch 的文章相对比较少,笔者也是摸索了许久,接下来本文介绍 Spr ...
- 和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮
前面几篇文章详细讲解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 来完成搜索查询,但是搜索一般都会有搜索关键字高亮的功能,今天我们把它给加上. 系列文 ...
- 和我一起打造个简单搜索之Logstash实时同步建立索引
用过 Solr 的朋友都知道,Solr 可以直接在配置文件中配置数据库连接从而完成索引的同步创建,但是 ElasticSearch 本身并不具备这样的功能,那如何建立索引呢?方法其实很多,可以使用 J ...
- 和我一起打造个简单搜索之IK分词以及拼音分词
elasticsearch 官方默认的分词插件,对中文分词效果不理想,它是把中文词语分成了一个一个的汉字.所以我们引入 es 插件 es-ik.同时为了提升用户体验,引入 es-pinyin 插件.本 ...
- 和我一起打造个简单搜索之ElasticSearch集群搭建
我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌.尺寸.适用季节.价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品. 站内搜索对 ...
- 和我一起打造个简单搜索之ElasticSearch入门
本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...
随机推荐
- 20 KMP匹配的Next值和Nextval值
i 0 1 2 3 4 5 6 7 8 s a b a b a a b a b n ...
- 升级pip10.0.0后出现ModuleNotFoundError: No module named 'pip'的问题
pip10升级后各种pip install出错----- Traceback (most recent call last): File "/usr/local/bin/pip", ...
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- :迭代器模式1:Iterator
//今天一口气把这一章前半部分的iterator例子的所有代码写完,涉及到了不少指针的内容,竟然一次性编译通过.... //Iterator与Menu之间应该不是has a的关系,先这样着吧. #if ...
- Cracking The Coding Interview 4.0_二叉树
#include <iostream> #include <string> using namespace std; class tree { public: tree() { ...
- 阶段01Java基础day10面向对象05
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格 ...
- 从命令行模式运行Windows管理工具。
从命令行模式运行Windows管理工具. 分类: Play Windows 2004-08-06 16:39 6076人阅读 评论(3) 收藏 举报 1.可以直接在开始-〉运行里面输入的管理工具: 文 ...
- elk之kibana
环境: centos7 jdk8 参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.htmlhttp:// ...
- SharePoint REST API - 列表和列表项
博客地址:http://blog.csdn.net/FoxDave 本篇主要讲述如何用SharePoint REST操作列表和列表项.阅读本篇时请先了解前面讲述的REST介绍和基本操作. 废话不多 ...
- ASCII码,utf-8
ASCII:0-127表示英文,128-255每个国家编码不一样,汉字要使用两个字节,为了和0-127区别,首位都要是1,uriEncode就是把字符转换成ASCII码. utf-8,一个字节的,和a ...