nyoj 82-迷宫寻宝(一) (多重BFS)
82-迷宫寻宝(一)
内存限制:64MB 时间限制:1000ms 特判: No
通过数:3 提交数:5 难度: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 分析: 1、要用多次BFS,每当我们找到一把钥匙我们手里的钥匙就自加,如果此时没有找到宝藏,我们依然有资本再来一次BFS,因为此时我们多了一点打开门的把握; 2、如果手里有的钥匙与要求开门的钥匙相同,那么这个门就可以打开,既然门打开了,如果此时我们没有找到宝藏,仍然有资本再来一次BFS 3、当然,BFS结束的条件是找到宝藏,或者再也找不到钥匙,再也打不开门 C/C++代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <set> 10 11 using namespace std; 12 const int MAXN = 25; 13 int flag, n, m, my_book[MAXN][MAXN], start_x, start_y, mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}, my_need[6], my_have[6]; 14 char my_map[MAXN][MAXN]; 15 struct node 16 { 17 int x, y; 18 }; 19 20 bool my_match(node q) 21 { 22 if (q.x < 0 || q.y < 0 || q.x >= n || q.y >= m) return false; 23 if (my_map[q.x][q.y] == 'X') return false; 24 if (my_book[q.x][q.y]) return false; 25 if (my_map[q.x][q.y] >= 'a' && my_map[q.x][q.y] <= 'e') 26 { 27 flag = 1; 28 my_have[my_map[q.x][q.y] - 'a'] ++; 29 my_map[q.x][q.y] = '.'; 30 return true; 31 } 32 if (my_map[q.x][q.y] >= 'A' && my_map[q.x][q.y] <= 'E') 33 { 34 if (my_have[my_map[q.x][q.y] - 'A'] == my_need[my_map[q.x][q.y] - 'A']) 35 { 36 my_map[q.x][q.y] = '.'; // 可以通过加上 flag = 1 进行优化 37 return true; 38 } 39 return false; 40 } 41 if (my_map[q.x][q.y] == '.' || my_map[q.x][q.y] == 'G') return true; 42 } 43 44 int bfs() 45 { 46 flag = 0; 47 memset(my_book, 0, sizeof(my_book)); 48 node q1, q2; 49 queue <node> Q; 50 q1.x = start_x, q1.y = start_y; 51 my_book[start_x][start_y] = 1; 52 Q.push(q1); 53 while(!Q.empty()) 54 { 55 q1 = Q.front(); 56 if(my_map[q1.x][q1.y] == 'G') return 1; 57 for(int i = 0; i <= 3; ++ i) 58 { 59 q2 = q1; 60 q2.x = q1.x + mov[i][0]; 61 q2.y = q1.y + mov[i][1]; 62 if (!my_match(q2)) continue; 63 my_book[q2.x][q2.y] = 1; 64 Q.push(q2); 65 } 66 Q.pop(); 67 } 68 if (flag) return 2; 69 return 0; 70 } 71 72 int main() 73 { 74 while(~scanf("%d%d", &n, &m), n || m) 75 { 76 memset(my_need, 0, sizeof(my_need)); 77 memset(my_have, 0, sizeof(my_have)); 78 for(int i = 0; i < n; ++ i) 79 { 80 getchar(); 81 scanf("%s", my_map[i]); 82 for (int j = 0; j < m; ++ j) 83 if (my_map[i][j] == 'S') 84 start_x = i, 85 start_y = j; 86 else if (my_map[i][j] >= 'a' && my_map[i][j] <= 'e') 87 my_need[my_map[i][j] - 'a'] ++; 88 } 89 90 while(1) 91 { 92 int t = bfs(); 93 if (t == 1) 94 { 95 printf("YES\n"); 96 break; 97 } 98 else if (t == 0) 99 { 100 printf("NO\n"); 101 break; 102 } 103 } 104 } 105 return 0; 106 }
nyoj 82-迷宫寻宝(一) (多重BFS)相关推荐
- 《搜索》— NYOJ 82 迷宫寻宝(一)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号 ...
- NYOJ 82 迷宫寻宝
描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开 ...
- nyoj 81 迷宫寻宝
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...
- NYOJ 82:迷宫寻宝(一)(BFS)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号 ...
- 迷宫寻宝(一) 82
/*迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...
- nyoj82 迷宫寻宝(一) (bfs)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...
- 初识BFS POJ-3278 Catch That Cow FZU-2285 迷宫寻宝
初识BFS POJ-3278 Catch That Cow FZU-2285 迷宫寻宝 令人窒息的创新实验课让我们写程序. POJ-3278 Catch That Cow Farmer John ha ...
- NYOJ 迷宫寻宝(一)
迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...
- 迷宫寻宝(自编简单版)
nyoj - 迷宫寻宝(1) 我觉得有点难...我将其改简单一些. 题目描述:与原题基本差不多,但开门条件改一下,每个门只需要一把钥匙即可打开,一把钥匙可以开所有对应的门. 这样就简单很多啦...其实 ...
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
Problem B 迷宫寻宝 Accept: 52 Submit: 183 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem D ...
最新文章
- 【北京-知春路】这10家互联网公司值得你加入
- DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
- vb.net2019-多线程并行计算(3)
- lisp不是函授型语言_【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...
- OS- -操作系统概念
- Ampere Altra Max 对比测试数据公布,性能能效双领先
- java的uuid有什么用_java – 什么是有效的UUID?
- Adaptive Execution patch and how to bulid on cdh5
- Win10验证USB Audio MIC(三)
- C++与STL简单介绍( C/C++机试)
- java~modelMapper需要注意的几点
- unzip命令常用参数
- office2010安装需MSXML版本6.10.1129.0详解解决方案
- asp.net 下利用DirectoryEntry验证用户及获取域控制器下的用户结构信息
- 一个统计文章字数的算法,求改进
- 83页XX市高速智慧公路总体建设方案
- windows下安装kali linux子系统详细教程
- 电子科技大学计算机考研题,电子科技大学820计算机考研真题题库
- 最全Python数据分析学习路径图,确定不看?
- mac版源码编译安装mysql