nyoj 82 迷宫寻宝(一)【dfs】
2017-02-28 17:25
316 查看
迷宫寻宝(一)
时间限制: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
AC代码:
# include <stdio.h> # include <string.h> # define N 25 struct Door { int x; //门的位置的横坐标 int y; //门的位置的纵坐标 int flag; //门的标记 int findnum; //能找到当前门的钥匙的数量 int key; //地图中门的钥匙的总数量 }; Door d[5]; char map ; //地图 int sx, sy; //入口坐标 int ok; //剪枝标记 int col, row; //寻宝人当前的坐标 void dfs(int x, int y); void isok() { for (int k = 0; k < 5; k++) { if (d[k].flag && d[k].key == d[k].findnum) //拦路之门已开 { int x = d[k].x; int y = d[k].y; map[x][y] = 'X'; //标记已经走过 dfs(x+1, y); //向下走 dfs(x, y-1); //向右走 dfs(x-1, y); //向上走 dfs(x, y+1); //向右走 } } } void dfs(int x, int y) { if (ok) { return ; } if (map[x][y] != 'X') { switch (map[x][y]) { case 'G' : ok = 1; return ; case 'A' : case 'B' : case 'C' : case 'D' : case 'E' : d[map[x][y] - 'A'].x = x; d[map[x][y] - 'A'].y = y; d[map[x][y] - 'A'].flag ++; return ; case 'a' : case 'b' : case 'c' : case 'd' : case 'e' : d[map[x][y] - 'a'].findnum ++; break; } map[x][y] = 'X'; //标记已经走过 dfs(x+1, y); //向下走 dfs(x, y-1); //向右走 dfs(x-1, y); //向上走 dfs(x, y+1); //向右走 isok(); } } int main(void) { while (scanf("%d %d", &row, &col), row != 0 || col != 0) { int i, j; ok = 0; memset(map, 'X', sizeof(map)); for (int k = 0; k < 5; k++) { d[k].flag = 0; d[k].key = 0; d[k].findnum = 0; } for (i = 1; i <= row; i++) { scanf("%s", &map[i][1]); for (j = 1; j <= col; j++) { switch (map[i][j]) { case 'S' : sx = i; sy = j; break; case 'a' : case 'b' : case 'c' : case 'd' : case 'e' : d[map[i][j] - 'a'].key ++; break; } } } dfs(sx, sy); if (ok) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }
相关文章推荐
- nyoj82 迷宫寻宝(一)(DFS 推荐看看)
- 【DFS】nyoj 82 迷宫寻宝(一)
- NYOJ - 82 - 迷宫寻宝(一) (DFS)
- nyoj82寻宝迷宫(一)搜索DFS
- NYOJ 82. 迷宫寻宝(一)(DFS/BFS)
- 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题
- nyoj 82 迷宫寻宝(一)
- NYOJ82 迷宫寻宝(一)【BFS】
- nyoj 82 迷宫寻宝一
- NYOJ -82 迷宫寻宝(一)
- nyoj 82 迷宫寻宝(一)
- NYOJ82 迷宫寻宝(BFS)
- nyoj82 迷宫寻宝(一) (搜索)
- NYOJ 82 迷宫寻宝(一)
- nyoj82(迷宫寻宝)
- NYOJ 82:迷宫寻宝(一)(BFS)
- Nyoj 82 迷宫寻宝(一)
- nyoj82 迷宫寻宝(一) (bfs)
- 迷宫寻宝(一)(nyoj 82)
- nyoj 82 迷宫寻宝(一) 【经典BFS】