NYOJ -82 迷宫寻宝(一)
2012-11-24 22:47
204 查看
迷宫寻宝(一)
时间限制: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 <iostream> #include <cstring> using namespace std; struct node { int x; int y; int num; }q[5]; char map[25][25]; int maxkeyOfDoor[5]; //存储打开一个门所有的钥匙数 int findkeyOfDoor[5]; //存储现今已经找到的钥匙数 bool flag; void DFS(int i, int j); void check(); void DFS(int i, int j) { if(map[i][j] != 'X') { switch (map[i][j]) { case 'a': case 'b': case 'c': case 'd': case 'e': ++findkeyOfDoor[map[i][j]-'a']; break; case 'A': case 'B': case 'C': case 'D': case 'E': q[map[i][j] - 'A'].x = i; q[map[i][j] - 'A'].y = j; ++q[map[i][j] - 'A'].num; return; case 'G': flag = true; return; } map[i][j] = 'X'; // 标记为已走 DFS(i-1, j); DFS(i+1, j); DFS(i, j-1); DFS(i, j+1); check(); } } void check() { for(int i = 0; i < 5; ++i) { if(q[i].num) { if(findkeyOfDoor[i] == maxkeyOfDoor[i]) //说明打开该门所需的钥匙已经全部找到,即可以打开门 { map[q[i].x][q[i].y] = 'X'; DFS(q[i].x-1, q[i].y); DFS(q[i].x+1, q[i].y); DFS(q[i].x, q[i].y-1); DFS(q[i].x, q[i].y+1); } } } } int main() { int tx, ty, m, n; while(cin >> m >> n && (m || n)) { flag = false; memset(maxkeyOfDoor, 0, sizeof(maxkeyOfDoor)); memset(findkeyOfDoor, 0, sizeof(findkeyOfDoor)); memset(q, 0, sizeof(q)); /* for(int i = 0; i <= m + 1; ++i) map[i][0] = map[i][n + 1] = 'X'; for(int i = 0; i <= n + 1; ++i) map[0][i] = map[m + 1][i] = 'X'; //添加两个fou循环可以防止越界 */ memset(map, 'X', sizeof(map)); //这样写也可以提交 for(int i = 1; i <= m; ++i) { for(int j = 1; j <= n; ++j) { cin >> map[i][j]; if(map[i][j] == 'S') { tx = i; ty = j; } else if(map[i][j] >= 'a' && map[i][j] <= 'e') ++maxkeyOfDoor[map[i][j] - 'a']; } } DFS(tx, ty); if(flag) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
相关文章推荐
- nyoj 82 迷宫寻宝(一)BFS
- NYOJ 82. 迷宫寻宝(一)(DFS/BFS)
- Nyoj 82 迷宫寻宝(一)
- nyoj 82 迷宫寻宝(一)
- nyoj82寻宝迷宫(一)搜索DFS
- nyoj-82-迷宫寻宝(一)
- NYOJ 82 迷宫寻宝(一)(多次 bfs)
- NYOJ 82 - 迷宫寻宝(一)
- nyoj 82 迷宫寻宝一
- 【BFS】迷宫寻宝(一)(nyoj-82)
- NYOJ82-迷宫寻宝1
- NYOJ82-迷宫寻宝(一)
- NYOJ 82【迷宫寻宝(一)】
- nyoj 82 迷宫寻宝(一)
- NYOJ 82 迷宫寻宝(一)
- NYOJ82 迷宫寻宝(一)(BFS)
- nyoj82 迷宫寻宝(一) (bfs)
- NYOJ-82 迷宫寻宝(一)【广搜】
- nyoj82 迷宫寻宝(一)(DFS 推荐看看)
- nyoj 82 迷宫寻宝(一)