迷宫寻宝(一)

来源:互联网 发布:windows消息机制详解 编辑:程序博客网 时间:2024/04/30 21:47

迷宫寻宝(一)

时间限制: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

这道题很有技巧的一个点就是碰到门的时候并且还没有足够的钥匙的时候就绕开走,continue语句很重要,并且判断对空的那条if语句不能删掉。

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int NI = 25;int n, m, num[5];char g[NI][NI];bool flag[NI][NI];int sx, sy, nx, ny;int dir[4][2] = {{-1,0}, {0,-1}, {1,0}, {0,1}};struct node {int x, y;node (int x, int y) : x(x), y(y) {};};bool judge(int x, int y) {if(x < 0 || x >= n || y < 0 || y >= m || g[x][y] == 'X' || flag[x][y]) {return false;} if(g[x][y] >= 'a' && g[x][y] <= 'e') {num[g[x][y]-'a']--;}return true;}bool bfs(int x, int y) {queue<node> q;flag[x][y] = true;//if(g[x][y] == 'G') return true;q.push(node(x, y));while(!q.empty()) {node t = q.front(); q.pop();if(g[t.x][t.y] >= 'A' && g[t.x][t.y] <= 'E' && num[g[t.x][t.y]-'A'] != 0) {if(q.empty()) return false;else {q.push(t);continue;}}for(int i = 0; i < 4; i++) {nx = t.x + dir[i][0];ny = t.y + dir[i][1];if(judge(nx, ny)) {if(g[nx][ny] == 'G') return true;flag[nx][ny] = true;q.push(node(nx, ny));}}}return false;}int main() {while(~scanf("%d%d", &n, &m) && (n || m)) {memset(flag, false, sizeof(flag));memset(num, 0, sizeof(num));for(int i = 0; i < n; i++) {scanf("%s", g[i]);}for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(g[i][j] >= 'a' && g[i][j] <= 'e') {num[g[i][j]-'a']++;}if(g[i][j] == 'S') {sx = i; sy = j;}}}bool res = bfs(sx, sy);if(res) printf("YES\n");else printf("NO\n");}return 0;}


0 0
原创粉丝点击