《搜索》— NYOJ 82 迷宫寻宝(一)
迷宫寻宝(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。
输入
输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
.表示可以走的路
S:表示ACM的出发点
G表示宝藏的位置
X表示这里有墙,ACM无法进入或者穿过。
A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
注意ACM只能在迷宫里向上下左右四个方向移动。
最后,输入0 0表示输入结束。
输出
每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。
样例输入
4 4
S.X.
a.X.
..XG
....
3 4
S.Xa
.aXB
b.AG
0 0
样例输出
YES
NO
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
//地图
char map[25][25];
//遍历标记
bool vis[25][25];
//是否找到宝藏
bool result;
//钥匙总数
int key[5];
//当前找到的钥匙总数
int curKey[5];
int n,m;
int st_x,st_y;
struct node
{ int x,y; bool exit;
}door[5];
void check();
void dfs(int x,int y)
{ if(x<0||y<0||x>=m||y>=n||map[x][y]=='X'||vis[x][y]) return ; //遇到门 判断能不能开门 如果不能开门 入栈 if(map[x][y]>='A'&&map[x][y]<='E'&&curKey[map[x][y]-'A']<key[map[x][y]-'A']) { door[map[x][y]-'A'].x=x; door[map[x][y]-'A'].y=y; door[map[x][y]-'A'].exit=true; return ; } vis[x][y]=true; //找到一个钥匙 curkey[]+1 if(map[x][y]>='a'&&map[x][y]<='e') curKey[map[x][y]-'a']++; if(map[x][y]=='G') { result=true; return ; } dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); check();
}
//地图找完后 回到门前再次判断是否可以开门
void check()
{ for(int i=0;i<5;i++) { if(door[i].exit) { if(curKey[i]==key[i]) { int x=door[i].x; int y=door[i].y; dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); } } }
}
int main()
{ while(~scanf("%d %d",&m,&n)) { if(m==0&&n==0) break; memset(key,0,sizeof(key)); memset(map,0,sizeof(map)); memset(vis,false,sizeof(vis)); memset(&door,0,sizeof(&door)); memset(curKey,0,sizeof(curKey)); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { char ch; scanf(" %c",&ch); map[i][j]=ch; if(ch>='a'&&ch<='e') key[ch-'a']++; if(ch=='S') st_x=i,st_y=j; } } result=false; dfs(st_x,st_y); if(result) printf("YES\n"); else printf("NO\n"); } return 0;
}
《搜索》— NYOJ 82 迷宫寻宝(一)相关推荐
- NYOJ 82 迷宫寻宝
描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开 ...
- nyoj 81 迷宫寻宝
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...
- NYOJ 82:迷宫寻宝(一)(BFS)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号 ...
- 迷宫寻宝(宽度搜索)(C++)
迷宫寻宝 题目 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,不限时间和步数,当然也没有陷阱,请你判断他能不能顺利的得到宝藏. 输入 多组输入 每组测试数据的第一行包含了两个整数M ...
- Qt利用深度优先搜索实现迷宫寻宝
先看效果: 利用QT搭建迷宫界面 利用单选框来构造迷宫,设置障碍物和宝藏的位置 利用深度优先搜索实现迷宫寻宝,并且在寻找的过程中避开障碍物. 搜索算法在线程中进行 定义方格的属性 enum Signa ...
- NYOJ 迷宫寻宝(一)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...
- 迷宫寻宝(一) 82
/*迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...
- 迷宫寻宝(一) 搜索
迷宫寻宝(一) 时间限制: 1 Sec 内存限制: 64 MB 提交: 24 解决: 7 [提交][状态][讨论版] 题目描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这 ...
- NYOJ-82迷宫寻宝(门与钥匙经典+搜索)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...
最新文章
- 七、使用栈实现综合计算器(中缀表达式)
- CSS基础篇--css reset重置样式有那么重要吗?
- 恐龙拼图游戏 - 恐龙拼图乐园积木游戏
- android中常用的下拉刷新加载更多_如何设计“加载流程”
- 计算机组成原理设计一个累加和,组成原理课设关于累加器.doc
- JavaScript:事件对象Event和冒泡
- Java反射基础(三)--Methods对象的使用
- 无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?
- Java数据类型BooleanDemo
- WIN10系统 Indirect Display 虚拟显示器之特殊应用
- L7805CV-ASEMI三端稳压管L7805CV
- markdown语言练习
- HDU - 2567 寻梦 ac代码
- 设置Notes暗黑模式
- Android基础| 1G-4G的介绍
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例...
- Eclipse编写代码时出现The word 'localhost' is not correctly spelled.禁告
- 什么是流批一体化、区块链
- stm32的简易小项目之震动感应灯
- ipv4地址怎么设置 手机_怎样修改手机的ip地址?手机IP地址如何修改