走迷宫拿宝藏,拿到所有对应的钥匙才能开门
*解法:从起点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. In-App Purchase Programming Guide----(七) ----Restoring Purchased Products

    Restoring Purchased Products Users restore transactions to maintain access to content they’ve alread ...

  2. hdoj【1006】【未完待续】

    题意: 时钟的三个指针在两两之间至少D°的时候是开心的,求开心时间占一天的一个百分比. 思路: 我们看到这个百分比有三位小数,精度很高. 一天有24h,24*60min,24*60*60s,那么最小单 ...

  3. bzoj 1187: [HNOI2007]神奇游乐园【插头dp】

    要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意 ...

  4. bzoj 4557: [JLoi2016]侦察守卫【树形dp】

    设f[u][i]为u点向下覆盖至少i层并且处理完u的子树的最小代价,f[u][i]为u点向上覆盖至少i层并且处理完u的子树的最小代价 转移的话显然f[u][i]+=f[v][i-1],但是f[u][0 ...

  5. 5.replace的用法,while循环,continue

    1.relace s='dadk12' print(s.replace('生活','dd'))==打印返回dadk12,即使没有也不会报错. 2.while continue while循环输出 1 ...

  6. redis的安装(图文详解)

    我这里,搭建在 继续

  7. poj1273 Drainage Ditches 基础网络流

    #include <iostream> #include <queue> using namespace std; ][]; ]; //路径上每个节点的前驱节点 ]; int ...

  8. python之迷宫BFS

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

  9. AtCoder Regular Contest 076 E - Connected?

    题目传送门:https://arc076.contest.atcoder.jp/tasks/arc076_c 题目大意: 给定一个\(R×C\)的矩阵,然后给定\(N\)对点,每对点坐标为\((X_{ ...

  10. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...