迷宫寻宝(一) 82
2015-10-31 20:41
417 查看
/*迷宫寻宝(一)
时间限制: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
、*
时间限制: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; int n,m,i,j; char map[22][22]; int key[5]; struct Node { int x; int y; }; queue<Node>QUE; Node zuobiao,door[5]; void search(int i,int j) { zuobiao.x = i+1; zuobiao.y = j; if(map[zuobiao.x][zuobiao.y] != 'X') { QUE.push(zuobiao); } zuobiao.x = i-1; zuobiao.y = j; if(map[zuobiao.x][zuobiao.y] != 'X') { QUE.push(zuobiao); } zuobiao.x = i; zuobiao.y = j+1; if(map[zuobiao.x][zuobiao.y] != 'X') { QUE.push(zuobiao); } zuobiao.x = i; zuobiao.y = j-1; if(map[zuobiao.x][zuobiao.y] != 'X') { QUE.push(zuobiao); } } int bfs() { memset(door,0,sizeof(door)); while(!QUE.empty()) { zuobiao = QUE.front(); QUE.pop(); i = zuobiao.x; j = zuobiao.y; if(map[i][j] >= 'a' && map[i][j] <= 'e')//找到药匙没找到门 { key[map[i][j]-'a']--; if(key[map[i][j] - 'a'] == 0 && door[map[i][j] - 'a'].x !=0 && door[map[i][j] - 'a'].y !=0)//即找到钥匙又找到了门 { QUE.push(door[map[i][j]-'a']); } map[i][j] = 'X'; search(i,j); } else if(map[i][j]>='A' && map[i][j]<= 'E' && key[map[i][j]-'A'] != 0)//找到了门,没有找到所有药匙 { door[map[i][j]-'A'] = zuobiao; } else if(map[i][j] == 'G') { return 1; } else if(map[i][j] != 'X') { map[i][j] = 'X'; search(i,j); } } return 0; } int main() { while(scanf("%d%d",&n,&m) && (n||m)) { memset(map,'X',sizeof(map)); memset(key,0,sizeof(key)); for(i=1;i<=n;i++) { scanf("%s",&map[i][1]); for(j=1;j<=m;j++) { if(map[i][j] == 'S') { zuobiao.x = i; zuobiao.y = j; QUE.push(zuobiao); } else if(map[i][j] >= 'a' && map[i][j] <= 'e') { key[map[i][j] - 'a']++; } } } if(bfs()) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }
相关文章推荐
- 任意输入字母打印字母三角
- bootstrap初探2
- ArrayList与LinkedList的基本添加删除方法 模拟栈 队列
- UVA-10269 Adventure of Super Mario (dijkstra)
- 【LEETCODE】235-Lowest Common Ancestor of a Binary Search Tree
- 词语变形练习题
- 三、jQuery--jQuery基础--jQuery基础课程--第8章 jQuery 实现Ajax应用
- LNMP - nginx代理详解
- 不养生反伤身的喝汤误区,看看你中了多少!!
- 多线程
- ImageView小技巧
- 掌握需求过程(三)
- Android-Universal-Image-Loader最新框架解析
- GCD
- java.util.ResourceBundle使用详解(java国际化)
- 《高级语言程序设计实训》那些事
- web的结构组件
- LNMP - nginx禁止指定user_agent
- TextView 小技巧
- 冲刺随笔列表