迷宫寻宝(一)

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

自己写时候时候很困惑,不知道该怎么设置标记让寻宝人在可行范围内遍历一遍以后可以再去开门。最后的想法是:“先遍历标记一遍以后,再把标记清空,再从开始位置重新遍历一遍。第二次遍历是及时遇到钥匙也不再增加钥匙的个数,遇到门的时候判断已经找个的钥匙个数是否可以打开该门。”代码写的太繁琐了,就不再贴出来,这里贴出来大神“可笑痴狂”博客园的代码。思想是:“每次递归都检查已经找个的钥匙数是否可以打开对应的门,如果可以打开相应的门,则该门可通,便从门的位置处也进行遍历。”

原文地址:http://www.cnblogs.com/dongsheng/archive/2012/11/24/2786477.html

#include <iostream>
#include <cstring>using namespace std;struct node
{int x;int y;int num;
}q[5];
char map[25][25];
int maxkeyOfDoor[5];    //存储打开一个门所有的钥匙数
int findkeyOfDoor[5];   //存储现今已经找到的钥匙数
bool flag;void DFS(int i, int j);
void check();void DFS(int i, int j)
{if(map[i][j] != 'X'){switch (map[i][j]){case 'a':case 'b':case 'c':case 'd':case 'e':++findkeyOfDoor[map[i][j]-'a'];break;case 'A':case 'B':case 'C':case 'D':case 'E':q[map[i][j] - 'A'].x = i;q[map[i][j] - 'A'].y = j;++q[map[i][j] - 'A'].num;return;case 'G':flag = true;return;}map[i][j] = 'X';   // 标记为已走DFS(i-1, j);DFS(i+1, j);DFS(i, j-1);DFS(i, j+1);check();}
}void check()
{for(int i = 0; i < 5; ++i){if(q[i].num){if(findkeyOfDoor[i] == maxkeyOfDoor[i])  //说明打开该门所需的钥匙已经全部找到,即可以打开门{map[q[i].x][q[i].y] = 'X';DFS(q[i].x-1, q[i].y);DFS(q[i].x+1, q[i].y);DFS(q[i].x, q[i].y-1);DFS(q[i].x, q[i].y+1);}}}
}int main()
{int tx, ty, m, n;while(cin >> m >> n && (m || n)){flag = false;memset(maxkeyOfDoor, 0, sizeof(maxkeyOfDoor));memset(findkeyOfDoor, 0, sizeof(findkeyOfDoor));memset(q, 0, sizeof(q));/*for(int i = 0; i <= m + 1; ++i)map[i][0] = map[i][n + 1] = 'X';for(int i = 0; i <= n + 1; ++i)map[0][i] = map[m + 1][i] = 'X';  //添加两个fou循环可以防止越界*/memset(map, 'X', sizeof(map));  //这样写也可以提交for(int i = 1; i <= m; ++i){for(int j = 1; j <= n; ++j){cin >> map[i][j];if(map[i][j] == 'S'){tx = i;ty = j;}else if(map[i][j] >= 'a' && map[i][j] <= 'e')++maxkeyOfDoor[map[i][j] - 'a'];}}DFS(tx, ty);if(flag)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;
}

NYOJ82-迷宫寻宝(一)相关推荐

  1. nyoj82(迷宫寻宝)

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

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

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

  3. NYOJ-82迷宫寻宝(门与钥匙经典+搜索)

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

  4. java迷宫寻宝,nyoj82 迷宫寻宝(一)bfs(java)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 思路:先把图中的钥匙用一个数组存储起来 当搜索走到门时如何数组中标记没有当前门对应的钥 ...

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

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

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

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

  7. 迷宫寻宝(一) 82

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

  8. 迷宫寻宝(宽度搜索)(C++)

    迷宫寻宝 题目 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,不限时间和步数,当然也没有陷阱,请你判断他能不能顺利的得到宝藏. 输入 多组输入 每组测试数据的第一行包含了两个整数M ...

  9. Qt利用深度优先搜索实现迷宫寻宝

    先看效果: 利用QT搭建迷宫界面 利用单选框来构造迷宫,设置障碍物和宝藏的位置 利用深度优先搜索实现迷宫寻宝,并且在寻找的过程中避开障碍物. 搜索算法在线程中进行 定义方格的属性 enum Signa ...

  10. PARL源码走读——使用策略梯度算法求解迷宫寻宝问题

    前不久,百度发布了基于PaddlePaddle的深度强化学习框架PARL.git传送门 作为一个强化学习小白,本人怀着学习的心态,安装并运行了PARL里的quick-start.不体验不知道,一体验吓 ...

最新文章

  1. python中不可不知的一个重要的集合模块
  2. 试用版office 2010中提示Error opening SocialConnectorRes.dll求解!!
  3. java math round小数_Java Math round() 使用方法及示例
  4. 【DIY】入门必看:arduino入门实用教程,esp8266获取互联网时间,nodemcu制作NTP客户端获取显示互联网时间...
  5. 关于TaskStatus状态WaitingForChildrenToComplete 的疑问
  6. Centos7 更新gcc版本
  7. 一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
  8. 在 Windows Azure 上部署预配置 Oracle VM
  9. Go 语言学习总结(5)—— Go 学习笔记总结
  10. PowerShell在SharePoint 2010自动化部署中的应用(1)--代码获取
  11. 台式计算机不用鼠标怎么关机,没有鼠标怎么关机
  12. linux 怎么格式化u盘写保护,u盘怎样去掉写保护状态手机怎么加密软件
  13. 树莓派Pico 开机自动运行程序
  14. linux禁止程序访问网络,linux内核强制访问控制--Apparmor
  15. NTT科学家武居博士:用光去开拓和改变世界
  16. CAP、BASE理论
  17. Zynga公布2021年第二季度财务业绩
  18. PHP绿色版 官网下载+安装(win7)
  19. Provision 过程(PB-ADV,PB-GATT,Net key,Unicast,Dev key,App key)
  20. SitePoint播客#158:饮酒与技术

热门文章

  1. MATLAB激活了还需要激活
  2. 蓝牙(二)A2DP协议
  3. 【SPSS】回归分析详细操作教程(附案例实战)
  4. git基本命令使用大全
  5. idea:使用idea连接mysql数据库
  6. Matlab粒子群聚类程序
  7. Mybatis源码解析——入门级
  8. java重置按钮功能函数_Bootstrap按钮功能之查询按钮和重置按钮
  9. gps有几个轨道面_GPS(全球定位系统)的 24 颗卫星的轨道是如何设计的?
  10. QT - 创建UDP Socket通信