http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=82

                    迷宫寻宝(一)

时间限制: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
来源
POJ月赛改编
上传者
张云聪
#include <iostream>
#include <cstring>
using namespace std;
char map[23][23];
int visit[23][23];
int yao[10];
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int isagain;
int flag = 0; int dfs(int x, int y){
if(map[x][y] == 'G'){
flag = 1;
return 1;
}
for(int i = 0; i < 4; i++){
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < m){
if(!visit[xx][yy]){
visit[xx][yy] = 1;
if(map[xx][yy] == '.'){
if(dfs(xx, yy))
return 1;
}
else if(map[xx][yy] >= 'a' && map[xx][yy] <= 'z'){
yao[map[xx][yy] - 'a']--; //找到对应钥匙了,相当于打开此门所需要的钥匙减一
if(yao[map[xx][yy]] == 0){ //可以打开对应的门了
isagain = 1; //所以可以给他一次重新搜索的机会
}
map[xx][yy] = '.';
if(dfs(xx, yy))
return 1;
}
else if(map[xx][yy] >= 'A' && map[xx][yy] <= 'E'){ //刚开始写成了A到G,所以永远到不了G的判断
if(yao[map[xx][yy] - 'A'] == 0){
// cout << "open: " << map[xx][yy] << endl;
map[xx][yy] = '.';
if(dfs(xx, yy))
return 1;
}
}
else if(map[xx][yy] == 'G'){
// cout << "G" << endl;
if(dfs(xx, yy))
return 1;
}
visit[xx][yy] = 0;
}
}
}
return 0;
} int main(){
std::ios::sync_with_stdio(false);
while(cin >> n >> m){
memset(visit, 0, sizeof(visit));
memset(yao, 0, sizeof(yao));
if((n == 0 && m == 0))
break;
int sx, sy;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> map[i][j];
if(map[i][j] >= 'a' && map[i][j] <= 'z'){
yao[map[i][j] - 'a']++; //记录每个门所需要的钥匙
}
else if(map[i][j] == 'S'){ //记录起点
sx = i, sy = j;
}
}
}
flag = 0;
isagain = 1;
while(isagain){ //可能可以打开门,重新尝试一次
isagain = 0;
memset(visit, 0, sizeof(visit)); //因为dfs里面有许多return,打断了还原0
visit[sx][sy] = 1;
flag = dfs(sx, sy);
if(flag)
break;
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
/*
5 5
SXaXG
.X.X.
.X.X.
.X.XA
.....
5 5
aE..S
bXX.c
XX.CX
GBA.B
XXe.e
5 5
a...a
XX.XX
bXSXG
.XAXB
.....
5 5
.X.XG
Sa..A
.b.Xc
XX..B
bC...
5 5
.X.XG
Sb..B
.b.Xc
XX..B
bC...
1 10
S.aAbBcC.G
0 0
*/

  

35-迷宫寻宝(一)-NYOJ82的更多相关文章

  1. NYOJ82 迷宫寻宝(一)【BFS】

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

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

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

  3. nyoj 82 迷宫寻宝(一)

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

  4. Unity3D实现立体迷宫寻宝

    Unity3D实现立体迷宫寻宝 这个小游戏是一个白痴在一个昏暗的房间走动找到关键得分点,然后通关游戏.入门Unity3D做的第一款游戏,比较无聊,但实现了一般的游戏功能.如,人物控制,碰撞检测,主控制 ...

  5. 迷宫寻宝(一)(bfs)

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

  6. Problem 2285 迷宫寻宝 (BFS)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2285 Problem 2285 迷宫寻宝 Accept: 323    Submit: 1247Time Li ...

  7. 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

    [题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ in ...

  8. Problem 2285 迷宫寻宝

    http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...

  9. nyoj 82 迷宫寻宝(二)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=83 题目解法主要在于判断两线段是否相交,思路是穷举所有地图四周的点,其中每一个边界上的点和终点构成一 ...

  10. nyist 82迷宫寻宝(一)(BFS)

    题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 此题在基础BFS上加入了门和钥匙,要找齐所有钥匙才能开门,所以要对门特殊处理. 1.先 ...

随机推荐

  1. crontab 总结

    crontab -e --------- linux定时任务提示-bash: crontab: command not found 执行 crontab 命令如果报 command not found ...

  2. LNMP安装及配置

    LNMP官方网站:http://lnmp.org http://oneinstack.com/install/ 安装详细介绍:http://lnmp.org/install.html 1,安装LNMP ...

  3. LeetCode OJ:Count Complete Tree Nodes(完全二叉树的节点数目)

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  4. UVALive 3708 Graveyard(思维题)

    将原有的每个雕塑的坐标位置,映射在一个总长为n+m的数轴上,设第一个点的坐标为0,(新的等分点必然有至少有一个和原来n等分的等分点重合,因为等分点可以等距的绕圆周旋转,总可以转到有至少一个重合的,不妨 ...

  5. pthread_cond_wait() 前使用 while 讲解

    pthread_cond_wait() 前使用 while 讲解 -- : LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数 ...

  6. 如何安装Microsoft Visual C++6.0

    Microsoft Visual C++6.0作为新手C语言编程软件,被大家广为使用,然而许多人为拷贝来的C++6.0安装包如何安装感到苦恼,因此许多同学都是以安装失败,安装不成 功而告终.接下来我就 ...

  7. Buffer 和Cache 的区别

    Buffer 和Cache 的区别buffer 与cache 操作的对象就不一样.buffer

  8. Yii 常用命令

    一.Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个 ...

  9. mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)

    环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...

  10. Python学习笔记 - 用VSCode写python的正确姿势

    最近在学习python,之前一直用notepad++作为编辑器,偶然发现了VScode便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持markd ...