走迷宫拿宝藏,拿到所有对应的钥匙才能开门
*解法:从起点bfs,遇到门时先放入队列中,取出的时候看钥匙够不够决定开不开门,如果不够就把它再放回队列继续往下走,当队列里只有几个门循环的时候就可以退出,所以记一个T<400
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
#define INF 1e9+10
char a[22][22];
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
int vis[22][22], use[22][22];
int n, m, key[6], num[6], flag;
queue<int> q;
void bfs(int sx, int sy)
{
while(!q.empty()) q.pop();
vis[sx][sy] = 1;
q.push(sx * m + sy);
int T = 0;
//队列里是能达到的点,标记vis的是能到达并拓展的点
while(!q.empty() && T < 400)
{
T++;
int x = q.front() / m, y = q.front() % m; q.pop();
if(a[x][y] >= 'A' && a[x][y] <= 'E')
{
if(key[a[x][y] - 'A'] == num[a[x][y] - 'A'])//开门
{
memset(vis, 0, sizeof(vis));
a[x][y] = '.';
vis[x][y] = 1;
}
else//不开门
{
q.push(x * m + y);
continue;
}
}
for(int i = 0; i < 4; i++)
{
int xx = x + dx[i], yy = y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < m && !vis[xx][yy] && a[xx][yy] != 'X')
{
if(a[xx][yy] == 'G') {flag = 1; return;}
if(a[xx][yy] == '.')
{
vis[xx][yy] = 1;
q.push(xx * m + yy);
}
if(a[xx][yy] >= 'a' && a[xx][yy] <= 'e')
{
key[a[xx][yy] - 'a']++;
vis[xx][yy] = 1;
a[xx][yy] = '.';
q.push(xx * m + yy);
}
if(a[xx][yy] >= 'A' && a[xx][yy] <= 'E')
{
q.push(xx * m + yy);//放入队列但不标记
}
}
}
}
}
int main()
{
while(1)
{
scanf("%d %d", &n, &m);
if(n == 0 && m == 0) break;
int sx, sy;
memset(key, 0, sizeof(key));
memset(num, 0, sizeof(num));
memset(vis, 0, sizeof(vis));
memset(use, 0, sizeof(use));
for(int i = 0; i < n; i++)
{
scanf(" %s", a[i]);
for(int j = 0; j < m; j++)
{
if(a[i][j] == 'S') sx = i, sy = j;
if(a[i][j] >= 'a' && a[i][j] <= 'e') num[a[i][j] - 'a']++;
}
}
for(int i = 0; i < 5; i++) if(num[i] == 0) num[i] = INF;
flag = 0;
bfs(sx, sy);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

  

搜索 || 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. CodeForces - 55D && UVALive - 6528

    A. 问L到R有多少能被自己各个数位上的非零数字整除的数字. 关键在于dp的状态:注意到这里有三个关键属性:当前数位,2~9出现的情况(0,1不用管), 原数字取余2520的结果(2~9的最小公倍数) ...

  2. SCUT - 249 - A piece of Cake - 组合数学

    https://scut.online/contest/25/I 由结论:d维物体切n刀分成的部分=sum(C(n,0)~C(n,d)),直接算就行了.

  3. bzoj 3172: [Tjoi2013]单词【AC自动机】

    一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后 ...

  4. 2019 年 Vue 学习路线图!

    如果你是 Vue 开发新手,可能已经听过很多行话术语,比如单页面应用程序.异步组件.服务器端渲染,等等.你可能还听说过与 Vue 有关的一些工具和库,比如 Vuex.Webpack.Vue CLI 和 ...

  5. web.xml中classpath*:与classpath:的区别

    classpath对应src目录,该目录下的文件会在编译后被存放到WEB-INF文件夹下的classes目录. classpath:只会到你的class路径中查找配置文件,对于多个同名的配置文件,只会 ...

  6. python之迷宫BFS

    # @File: maze_queue_bfs from collections import deque maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0 ...

  7. bzoj1878 [SDOI2009]HH的项链【莫队】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1878 以每个询问左端点所属的块的编号为第一关键字,右端点本身为第二关键字,排序,然后保利扫描 ...

  8. 设置Linux环境变量的方法和区别_Ubuntu/CentOS

    设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别. 通过文件设置 Linux 环境变量 首先是设置全局环境变量,对所有用 ...

  9. Little Elephant and Elections CodeForces - 258B

    Little Elephant and Elections CodeForces - 258B 题意:给出m,在1-m中先找出一个数x,再在剩下数中找出6个不同的数y1,...,y6,使得y1到y6中 ...

  10. 将picpick汉化及矩形截屏