迷宫寻宝(一)

时间限制: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;
//地图
char map[25][25];
//遍历标记
bool vis[25][25];
//是否找到宝藏
bool result;
//钥匙总数
int key[5];
//当前找到的钥匙总数
int curKey[5];
int n,m;
int st_x,st_y;
struct node
{  int x,y;  bool exit;
}door[5];
void check();
void dfs(int x,int y)
{  if(x<0||y<0||x>=m||y>=n||map[x][y]=='X'||vis[x][y])  return ;  //遇到门 判断能不能开门 如果不能开门 入栈   if(map[x][y]>='A'&&map[x][y]<='E'&&curKey[map[x][y]-'A']<key[map[x][y]-'A'])  {  door[map[x][y]-'A'].x=x;  door[map[x][y]-'A'].y=y;  door[map[x][y]-'A'].exit=true;  return ;  }  vis[x][y]=true;  //找到一个钥匙 curkey[]+1   if(map[x][y]>='a'&&map[x][y]<='e')  curKey[map[x][y]-'a']++;  if(map[x][y]=='G')  {  result=true;  return ;  }  dfs(x+1,y);  dfs(x-1,y);  dfs(x,y+1);  dfs(x,y-1);  check();
}
//地图找完后 回到门前再次判断是否可以开门
void check()
{  for(int i=0;i<5;i++)  {  if(door[i].exit)  {  if(curKey[i]==key[i])  {  int x=door[i].x;  int y=door[i].y;  dfs(x+1,y);  dfs(x-1,y);  dfs(x,y+1);  dfs(x,y-1);  }  }  }
}
int main()
{  while(~scanf("%d %d",&m,&n))  {  if(m==0&&n==0)  break;  memset(key,0,sizeof(key));  memset(map,0,sizeof(map));  memset(vis,false,sizeof(vis));  memset(&door,0,sizeof(&door));  memset(curKey,0,sizeof(curKey));  for(int i=0;i<m;i++)  {  for(int j=0;j<n;j++)  {  char ch;  scanf(" %c",&ch);  map[i][j]=ch;  if(ch>='a'&&ch<='e')  key[ch-'a']++;  if(ch=='S')  st_x=i,st_y=j;  }  }  result=false;  dfs(st_x,st_y);  if(result)  printf("YES\n");  else  printf("NO\n");  }  return 0;
}  

《搜索》— NYOJ 82 迷宫寻宝(一)相关推荐

  1. NYOJ 82 迷宫寻宝

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

  2. nyoj 81 迷宫寻宝

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

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

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

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

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

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

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

  6. NYOJ 迷宫寻宝(一)

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

  7. 迷宫寻宝(一) 82

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

  8. 迷宫寻宝(一) 搜索

    迷宫寻宝(一) 时间限制: 1 Sec  内存限制: 64 MB 提交: 24  解决: 7 [提交][状态][讨论版] 题目描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这 ...

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

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

最新文章

  1. 七、使用栈实现综合计算器(中缀表达式)
  2. CSS基础篇--css reset重置样式有那么重要吗?
  3. 恐龙拼图游戏 - 恐龙拼图乐园积木游戏
  4. android中常用的下拉刷新加载更多_如何设计“加载流程”
  5. 计算机组成原理设计一个累加和,组成原理课设关于累加器.doc
  6. JavaScript:事件对象Event和冒泡
  7. Java反射基础(三)--Methods对象的使用
  8. 无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?
  9. Java数据类型BooleanDemo
  10. WIN10系统 Indirect Display 虚拟显示器之特殊应用
  11. L7805CV-ASEMI三端稳压管L7805CV
  12. markdown语言练习
  13. HDU - 2567 寻梦 ac代码
  14. 设置Notes暗黑模式
  15. Android基础| 1G-4G的介绍
  16. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例...
  17. Eclipse编写代码时出现The word 'localhost' is not correctly spelled.禁告
  18. 什么是流批一体化、区块链
  19. stm32的简易小项目之震动感应灯
  20. ipv4地址怎么设置 手机_怎样修改手机的ip地址?手机IP地址如何修改

热门文章

  1. Unix哲学学习笔记
  2. 驱动力3.0,动力全开~
  3. 弥散阴影html,设计弥散阴影效果海报图片的PS实例教程
  4. SQL闭合方式的判断及作用
  5. 廖雪峰官方网站python学习笔记:第一个Pyhon程序
  6. 5G标准正式出炉 5G的杀手锏业务又在哪里呢
  7. 微信网站域名被红(被封锁、被屏蔽、被和谐)的解决方法
  8. 【Metal学习笔记】--02.调用Metal-cpp从零编写C++程序
  9. 有一种异性朋友叫温暖
  10. 百度新闻评论内容抓取