搜索 || BFS || POJ 2157 Maze
#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的更多相关文章
- POJ 2157 Maze
Maze Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3183 Accepted: 996 Description A ...
- 搜索 || BFS || POJ 3278 Catch That Cow
农夫在x位置,下一秒可以到x-1, x+1, 2x,问最少多少步可以到k *解法:最少步数bfs 要注意的细节蛮多的,写在注释里了 #include <iostream> #include ...
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- HDU 1312 Red and Black --- 入门搜索 BFS解法
HDU 1312 题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
随机推荐
- In-App Purchase Programming Guide----(七) ----Restoring Purchased Products
Restoring Purchased Products Users restore transactions to maintain access to content they’ve alread ...
- hdoj【1006】【未完待续】
题意: 时钟的三个指针在两两之间至少D°的时候是开心的,求开心时间占一天的一个百分比. 思路: 我们看到这个百分比有三位小数,精度很高. 一天有24h,24*60min,24*60*60s,那么最小单 ...
- bzoj 1187: [HNOI2007]神奇游乐园【插头dp】
要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意 ...
- 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.replace的用法,while循环,continue
1.relace s='dadk12' print(s.replace('生活','dd'))==打印返回dadk12,即使没有也不会报错. 2.while continue while循环输出 1 ...
- redis的安装(图文详解)
我这里,搭建在 继续
- poj1273 Drainage Ditches 基础网络流
#include <iostream> #include <queue> using namespace std; ][]; ]; //路径上每个节点的前驱节点 ]; int ...
- python之迷宫BFS
# @File: maze_queue_bfs from collections import deque maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0 ...
- AtCoder Regular Contest 076 E - Connected?
题目传送门:https://arc076.contest.atcoder.jp/tasks/arc076_c 题目大意: 给定一个\(R×C\)的矩阵,然后给定\(N\)对点,每对点坐标为\((X_{ ...
- 模板——扩展欧几里得算法(求ax+by=gcd的解)
Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...