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)相关推荐

  1. 《搜索》— NYOJ 82 迷宫寻宝(一)

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号 ...

  2. NYOJ 82 迷宫寻宝

    描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开 ...

  3. nyoj 81 迷宫寻宝

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...

  4. NYOJ 82:迷宫寻宝(一)(BFS)

    迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号 ...

  5. 迷宫寻宝(一) 82

    /*迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编 ...

  6. nyoj82 迷宫寻宝(一) (bfs)

    迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...

  7. 初识BFS POJ-3278 Catch That Cow FZU-2285 迷宫寻宝

    初识BFS POJ-3278 Catch That Cow FZU-2285 迷宫寻宝 令人窒息的创新实验课让我们写程序. POJ-3278 Catch That Cow Farmer John ha ...

  8. NYOJ 迷宫寻宝(一)

    迷宫寻宝(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门 ...

  9. 迷宫寻宝(自编简单版)

    nyoj - 迷宫寻宝(1) 我觉得有点难...我将其改简单一些. 题目描述:与原题基本差不多,但开门条件改一下,每个门只需要一把钥匙即可打开,一把钥匙可以开所有对应的门. 这样就简单很多啦...其实 ...

  10. 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝

    Problem B 迷宫寻宝 Accept: 52    Submit: 183 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem D ...

最新文章

  1. 【北京-知春路】这10家互联网公司值得你加入
  2. DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
  3. vb.net2019-多线程并行计算(3)
  4. lisp不是函授型语言_【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...
  5. OS- -操作系统概念
  6. Ampere Altra Max 对比测试数据公布,性能能效双领先
  7. java的uuid有什么用_java – 什么是有效的UUID?
  8. Adaptive Execution patch and how to bulid on cdh5
  9. Win10验证USB Audio MIC(三)
  10. C++与STL简单介绍( C/C++机试)
  11. java~modelMapper需要注意的几点
  12. unzip命令常用参数
  13. office2010安装需MSXML版本6.10.1129.0详解解决方案
  14. asp.net 下利用DirectoryEntry验证用户及获取域控制器下的用户结构信息
  15. 一个统计文章字数的算法,求改进
  16. 83页XX市高速智慧公路总体建设方案
  17. windows下安装kali linux子系统详细教程
  18. 电子科技大学计算机考研题,电子科技大学820计算机考研真题题库
  19. 最全Python数据分析学习路径图,确定不看?
  20. mac版源码编译安装mysql

热门文章

  1. ubuntu 编译安装opencv官网教程
  2. 结合深度学习检测心脏 智能戒指体积小又准确
  3. java 手机声音提醒功能_Android基于广播事件机制实现简单定时提醒功能代码
  4. 陌上花开,可缓缓归矣
  5. 车道线检测方法的一些近期论文
  6. C++设计原则——开闭原则(持续更新中)
  7. MacBook 更改为Windows的按键布局
  8. 会声会影导出视频跳帧一卡一卡解决办法
  9. 上帝说:“首先,请叫我同志……”3
  10. 计算机图形学——二维卡通人物交互设计