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 ,这个版本比较稳 ...
随机推荐
- python3- __slots__
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ = ('name' ...
- vue-cli webpack全局引入jquery
1.首先在package.json里加入, dependencies:{ "jquery" : "^2.2.3" } 2.安装依赖 npm install jq ...
- install sz rz linux
1◆ ready 2◆ controller component Xshell 注册码:690313-111999-999313 Xftp 注册码:101210-450789-147200 3 ...
- Java中的equals和==的差别 以及Java中等价性和同一性的讨论
==对基本数据类型比较的是值,对引用类型比较的是地址 equals()比较的是对象的数据的引用 等价性原理: 自反性 x.equals(x)为true 对称性 x.equals(y) 为t ...
- jquery插件artTxtCount输入字数限制,并提示剩余字数
工作中用到,需要批量处理下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- 栈回溯简单实现(x86)
0x01 栈简介 首先局部变量的分配释放是通过调整栈指针实现的,栈为函数调用和定义局部变量提供了一块简单易用的空间,定义在栈上的变量不必考虑内存申请和释放.只要调整栈指针就可以分配和释放内存. ...
- U盘如何去除写保护
用一个简单而粗暴的方法去除U盘写保护: www.upantool.com/hfxf/xiufu//FormatTool.html#softdown 没有比这个更牛的软件了.
- oracle截取字符串区间段的一部分字符串
Oracle SQL中实现indexOf和lastIndexOf功能,substr和instr用法 博客分类: oracle PL/SQL instrsubstrlastindexofindexofo ...
- L290 英语中级班-3月上
1元音饱满度 a [ei] name gamee [i:] he she mei [ai] fine likeo [ou] go homeu [ u:] use blue 2口音适应 刚开始说时,慢点 ...
- 合并k个有序数组
给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为n*k的数组保存最后的结果创建一个大小为k的最小 ...