/*迷宫寻宝(一)
时间限制: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;
}

迷宫寻宝(一) 82相关推荐

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

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

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

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

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

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

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

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

  5. nyoj82(迷宫寻宝)

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

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

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

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

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

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

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

  9. nyoj 81 迷宫寻宝

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

最新文章

  1. 【VMCloud云平台】SCCM(四)域内推送代理
  2. php 多线程上传,PHP多线程(pthreads)参数传递学习笔记
  3. 安装 centos 7.x 自定义分区
  4. 数据竞赛入门-金融风控(贷款违约预测)二、EDA
  5. nodejs实践录:开篇
  6. 敏捷开发般若敏捷系列之五:如何推广敏捷(中)(无寿者,回报,破我执)...
  7. c++vector操作
  8. 【操作系统】Mac环境配置
  9. error LNK2005
  10. Unity 路径点弧线运动
  11. 关于MATLAB powergui 无法调整为discrete的解决方法
  12. HTML5 第004篇 <abbr>标签【定义缩写】
  13. mysql怎么将成绩划分等级_数据库mysql中case如何给成绩划分等级?
  14. 最新GraphPad Prism Mac直装版(医学绘图软件)v9.4.1
  15. 渗透学什么?渗透测试中超全的提权思路来了!
  16. C语言经典练习题(2)——“冒泡排序(Bubble Sort)“
  17. Windows环境下修改redis默认端口和密码,以及启动方式
  18. 2018年全国多校算法寒假训练营练习比赛(第五场)The Biggest Water Problem
  19. 工业智能网关BL110应用之64:如何实现智能楼宇控制BACnet 接入金鸽MQTT云平台
  20. springboot 页面静态化

热门文章

  1. 怎么去掉ECShop购物流程中收货人电子邮箱必填
  2. tomcat配置 详解
  3. 2022保密教育线上培训考试参考答案 01
  4. Ctrl c 复制html,一键复制粘贴(用热键代替Ctrl+X、Ctrl+C、Ctrl+V)
  5. 快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令
  6. Spring Boot优缺点总结
  7. substr函数功能
  8. 开发一个 Chrome 浏览器插件,拢共分几步?
  9. 哈夫曼树 (100分)哈夫曼树
  10. 三个真话一个假话c语言,推理题-逻辑推理题有A、B、C三个精灵,其中一个只说真话,另外一个只说假 爱问知识人...