迷宫寻宝(一)
2016-03-25 17:35
295 查看
题目描述
一个叫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<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; char e[25][25]; int r[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int key[10],vis[25][25]; struct node{ int x,y; }; int n,m; bool limited(node a){ if(e[a.x][a.y]>='a'&&e[a.x][a.y]<='z') key[e[a.x][a.y]-'a']--; else if(e[a.x][a.y]=='G') return true; return false; } void bfs(int ex,int ey){ queue<node> q; node t1,t2; t1.x=ex;t1.y=ey; vis[t1.x][t1.y]=1; q.push(t1); while(!q.empty()){ t1=q.front();q.pop(); if(limited(t1)){ printf("YES\n"); return; } if(e[t1.x][t1.y]>='A'&&e[t1.x][t1.y]<='Z'){ if(!key[e[t1.x][t1.y]-'A']) e[t1.x][t1.y]='.'; else{ if(q.empty()) break; q.push(t1); continue; } } for(int i=0;i<4;i++){ t2.x=t1.x+r[i][0]; t2.y=t1.y+r[i][1]; if(t2.x<0||t2.x>=n||t2.y<0||t2.y>=m||vis[t2.x][t2.y]||e[t2.x][t2.y]=='X') continue; vis[t2.x][t2.y]=1; q.push(t2); } } printf("NO\n"); } int main(){ while(~scanf("%d%d",&n,&m)){ if(n==0&&m==0) break; memset(vis,0,sizeof(vis)); memset(key,0,sizeof(key)); for(int i=0;i<n;i++) scanf("%s",e[i]); int a,b; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(e[i][j]=='S'){ a=i;b=j; } if(e[i][j]>='a'&&e[i][j]<='z'){ key[e[i][j]-'a']++; } } } bfs(a,b); } return 0; }
相关文章推荐
- Surrounded Regions
- Word Ladder, Gray Code
- UVA 11624
- HDU1495
- HDU2612 Find a way
- HDU1241 Oil Deposits
- Hdu2444二分图
- 最少步数BFS
- 转v_JULY_v的 BFS和DFS优先搜索算法
- 2015 寒假搜索专题 I - Meteor Shower(BFS)
- Same Tree
- E - Roads in the North
- DFS&BFS算法总结(1)
- Word Ladder I
- 图的BFS和DFS学习笔记
- [LeetCode] Binary Tree Level Order Traversal
- [LeetCode] Binary Tree Level Order Traversal II
- 关于BFS搜索的思想, 最简单的水题,不过深有体会啊。
- Word Ladder II
- Surrounded Regions