nyoj82(迷宫寻宝)

迷宫寻宝(一)

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

解决思路:深搜和广搜都可以,我采用的是深搜(根据网上)

1.数据输入时,保存每种钥匙的个数

2.每层先判断当前位置的信息

(1).为'.'继续搜索周围

(2).为‘X’返回

(3).为’A‘-’E'保存门的信息(注意不要标记X,如果标记将来就无法访问此门了,会被覆盖)

(4).为‘a’-‘e’钥匙++

3.在最后查看门能否打开,如果可以打开就搜索门的周围,并标记X

4.重复2.3直到找到出口或者无路可走

#include <stdio.h>
#include <memory.h>int key[6];
int keyNow[6];struct Lock
{int x, y;int num;
};
Lock lock[6];
char map[22][22];
char dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int w, h, sx, sy, ex, ey;
bool flag;
void dfs(int x, int y);inline bool canMove(int x, int y)        // 能否移动
{return !(x<0||x>=w||y<0||y>=h);
}void checkLock()
{int nx, ny;for (int i=0; i<5; ++i){if ((keyNow[i]>0) && (keyNow[i] == key[i]) && lock[i].num > 0)    // 判断是否找齐钥匙{map[lock[i].y][lock[i].x] = 'X';     // 只有找到钥匙才能通过门for (int j=0; j<4; ++j){nx = lock[i].x+dir[j][0];ny = lock[i].y+dir[j][1];if (canMove(nx, ny))dfs(nx, ny);          // 从门的周围开始搜索}}}
}void dfs(int x, int y)
{if (flag)          // 已经找到return;if (x==ex && y==ey)   //{flag = true;puts("YES");return;}if (map[y][x] == 'X')     // 此路不通{return;}if (map[y][x]>='a' && map[y][x]<='e')           // 钥匙++{keyNow[map[y][x]-'a']++;}else if (map[y][x]>='A' && map[y][x]<='E')       // 记录门的坐标{lock[map[y][x]-'A'].num++;lock[map[y][x]-'A'].x = x;lock[map[y][x]-'A'].y = y;return;       // 必须返回, 目的是防止深度搜的时候,再次遇到相同的门覆盖此次位置}map[y][x] = 'X';int nx, ny;for (int i=0; i<4; ++i){nx = x+dir[i][0];ny = y+dir[i][1];if (canMove(nx, ny)){dfs(nx, ny);       // 搜索周围}}checkLock();   // 检查门能否打开并继续搜索
}int main()
{while (scanf("%d%d", &h, &w) && (h||w)){getchar();memset(key, 0, sizeof(key));memset(keyNow, 0, sizeof(keyNow));memset(lock, 0, sizeof(lock));for (int i=0; i<h; ++i){for (int j=0; j<w; ++j){scanf("%c", &map[i][j]);if (map[i][j]>='a' && map[i][j]<='e'){key[map[i][j]-'a']++;      // 保存钥匙的个数}else if (map[i][j] == 'S'){sx = j;sy = i;map[i][j] = '.';}else if (map[i][j] == 'G'){ex = j; ey = i;map[i][j] = '.';}}getchar();}flag = false;dfs(sx, sy);if (!flag)puts("NO");}return 0;
}

nyoj82(迷宫寻宝)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 迷宫寻宝(一) 82

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

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

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

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

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

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

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

最新文章

  1. int long java_java long int的区别
  2. @Url cannot be used with @GET URL (parameter #1)
  3. tcpdump 抓二层包_可能是我见过的最简单易懂且实用的 TCPDump 和 Wireshark 抓包及分析教程!( 强烈建议收藏 )...
  4. nodejs 嵌套消除和高并发
  5. java高并发多线程架构_《Java高并发编程详解-多线程架构与设计》线程安全与数据同步...
  6. spring cloud超时时间设置
  7. 用jframe给MySQL输入数据_如何从JTextField输入Info到sql数据库?
  8. python的copy模块是哪个模块_每周一个 Python 模块 | copy
  9. Gargamel:信息安全取证工具
  10. CCS安装多版本编译器 Compiler version__更新手动下载、安装方法
  11. java字符常量_字符常量 java
  12. Java开发工具(二):Intellij Idea IU-2019.2.3版安装配置简明教程
  13. 双系统启动菜单删除无效Win启动菜单项
  14. 百度市值要被京东超越了?你投百度还是京东?
  15. wordpress 安装插件
  16. 想学Python,这68个内置函数你一定要搞定!
  17. 人工智能:一图看懂人工智能,人工智能知识体系【历史--内涵和外延--未来学--对社会经济的影响--技术体系--应用领域】
  18. [开源免费] ZXTouch - iOS11-14 iOS13 模拟触摸 模拟点击 比触动精灵和AutoTouch更好用的插件
  19. matlab开环调速,直流电动机开环调速MATLAB系统仿真
  20. U启动U盘启动盘制作

热门文章

  1. C语言位操作的神应用(位操作)
  2. ACM-音频编解码器管理器
  3. Java入门第112课——使用Iterator的hasNext方法、next方法遍历集合
  4. 通过evel将字符串作为函数执行函数
  5. 【转】dB、dBm是什么意思~
  6. Mysql优化(一)—Sql语句
  7. TCP/IP网络编程——IO复用
  8. Linux read系统调用之 submit_bio()
  9. Django 1.9 支持中文
  10. Java生成唯一主键