走迷宫拿宝藏,拿到所有对应的钥匙才能开门
*解法:从起点bfs,遇到门时先放入队列中,取出的时候看钥匙够不够决定开不开门,如果不够就把它再放回队列继续往下走,当队列里只有几个门循环的时候就可以退出,所以记一个T<400
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <queue>
  5. using namespace std;
  6. #define INF 1e9+10
  7. char a[22][22];
  8. int dx[] = {-1, 1, 0, 0};
  9. int dy[] = {0, 0, -1, 1};
  10. int vis[22][22], use[22][22];
  11. int n, m, key[6], num[6], flag;
  12. queue<int> q;
  13. void bfs(int sx, int sy)
  14. {
  15. while(!q.empty()) q.pop();
  16. vis[sx][sy] = 1;
  17. q.push(sx * m + sy);
  18. int T = 0;
  19. //队列里是能达到的点,标记vis的是能到达并拓展的点
  20. while(!q.empty() && T < 400)
  21. {
  22. T++;
  23. int x = q.front() / m, y = q.front() % m; q.pop();
  24. if(a[x][y] >= 'A' && a[x][y] <= 'E')
  25. {
  26. if(key[a[x][y] - 'A'] == num[a[x][y] - 'A'])//开门
  27. {
  28. memset(vis, 0, sizeof(vis));
  29. a[x][y] = '.';
  30. vis[x][y] = 1;
  31. }
  32. else//不开门
  33. {
  34. q.push(x * m + y);
  35. continue;
  36. }
  37. }
  38. for(int i = 0; i < 4; i++)
  39. {
  40. int xx = x + dx[i], yy = y + dy[i];
  41. if(xx >= 0 && xx < n && yy >= 0 && yy < m && !vis[xx][yy] && a[xx][yy] != 'X')
  42. {
  43. if(a[xx][yy] == 'G') {flag = 1; return;}
  44. if(a[xx][yy] == '.')
  45. {
  46. vis[xx][yy] = 1;
  47. q.push(xx * m + yy);
  48. }
  49. if(a[xx][yy] >= 'a' && a[xx][yy] <= 'e')
  50. {
  51. key[a[xx][yy] - 'a']++;
  52. vis[xx][yy] = 1;
  53. a[xx][yy] = '.';
  54. q.push(xx * m + yy);
  55. }
  56. if(a[xx][yy] >= 'A' && a[xx][yy] <= 'E')
  57. {
  58. q.push(xx * m + yy);//放入队列但不标记
  59. }
  60. }
  61. }
  62. }
  63. }
  64. int main()
  65. {
  66. while(1)
  67. {
  68. scanf("%d %d", &n, &m);
  69. if(n == 0 && m == 0) break;
  70. int sx, sy;
  71. memset(key, 0, sizeof(key));
  72. memset(num, 0, sizeof(num));
  73. memset(vis, 0, sizeof(vis));
  74. memset(use, 0, sizeof(use));
  75. for(int i = 0; i < n; i++)
  76. {
  77. scanf(" %s", a[i]);
  78. for(int j = 0; j < m; j++)
  79. {
  80. if(a[i][j] == 'S') sx = i, sy = j;
  81. if(a[i][j] >= 'a' && a[i][j] <= 'e') num[a[i][j] - 'a']++;
  82. }
  83. }
  84. for(int i = 0; i < 5; i++) if(num[i] == 0) num[i] = INF;
  85. flag = 0;
  86. bfs(sx, sy);
  87. if(flag) printf("YES\n");
  88. else printf("NO\n");
  89. }
  90. return 0;
  91. }

  

搜索 || BFS || POJ 2157 Maze的更多相关文章

  1. POJ 2157 Maze

    Maze Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3183   Accepted: 996 Description A ...

  2. 搜索 || BFS || POJ 3278 Catch That Cow

    农夫在x位置,下一秒可以到x-1, x+1, 2x,问最少多少步可以到k *解法:最少步数bfs 要注意的细节蛮多的,写在注释里了 #include <iostream> #include ...

  3. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...

  4. HDU 1312 Red and Black --- 入门搜索 BFS解法

    HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...

  5. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  6. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  7. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  8. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

  9. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

随机推荐

  1. 【旧文章搬运】分析了一下360安全卫士的HOOK

    原文发表于百度空间及看雪论坛,2009-10-08 看雪论坛地址:https://bbs.pediy.com/thread-99128.htm 看时间,09年的国庆节基本上就搞这玩意儿了...==== ...

  2. bzoj 1385: [Baltic2000]Division expression【脑洞】

    加括号再去括号就是除变加,显然尽可能多的除变加是最优的,然后发现唯一不能变成乘数的是第二个数,所以把其他数乘起来mod第二个数,如果是0就是YES,否则说明最后不能除尽,就是NO #include&l ...

  3. bzoj 3573: [Hnoi2014]米特运输【树形dp+瞎搞】

    阅读理解题,题意是以1为根的有根树,每个点有点权,求修改最少点权能使每个点的权值等于其所有子节点权值之和并且每个点的所有子节点权值相等的个数 然后就比较简单了,就是有个技巧是数太大,需要对所有操作都取 ...

  4. Springboot 配置 application.yml 连接MySQL数据库

    1.在pom.xml的<dependencies></dependencies>标签中中加入以下依赖 <dependency> <groupId>org ...

  5. poj2893 M*N puzzle 【n*m数码问题小结】By cellur925

    题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...

  6. 3分钟入门微信小程序直播

    效果预览 开发环境搭建 安装微信开发者工具   相对于以前微信以前的产品来说.小程序在发布之初就面向开发者开放微信开发者工具.使开发者更加方便的开发和调试小程序.我们从官网下载安装.官网下载地址.现在 ...

  7. 项目上线后出现Bug,该如何处理?

    项目在上线之后又出现了Bug,这让很多测试人员和开发人员头痛.但很多时候线上Bug普遍地存在,不可避免. 任何项目都存在未发现 Bug  和 已发现 Bug  两种情况,不存在没有 Bug的情况. 即 ...

  8. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...

  9. 洛谷 P4219 [BJOI2014]大融合

    查询,就相当于先删去这条边,然后查询边的两个端点所在连通块大小,乘起来得到答案,然后再把边加回去 可以用线段树分治做 #pragma GCC optimize("Ofast") # ...

  10. Coloring Trees CodeForces - 711C

    Coloring Trees CodeForces - 711C 题意:有n个点,每个点有一个c值,如果为0表示它没有被染色,否则表示它被染成了c值的颜色.颜色有1到m.把第i棵树染成颜色j所需要的代 ...