走迷宫拿宝藏,拿到所有对应的钥匙才能开门
*解法:从起点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. 从零开始构建一个Reactor模式的网络库(二)线程类Thread

    线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...

  2. F - Candy Bags

    A. Candy Bags time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. 007--linux常用命令nginx和nfs服务

    作业: 集群搭建 1.部署nginx反向代理三个web服务,调度算法使用加权轮询: 2.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: 一.nginx服务 1. 先 ...

  4. 洛谷 - P1004 - 方格取数 - 简单dp

    https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...

  5. SDUT2161:Simple Game(NIM博弈+巴什博弈)

    传送门 题意 n堆石子,每次可以取一堆至三堆任意非零石子数,取完者赢,问最后谁能赢 分析 以前我们做过NIM博弈是对一堆进行操作,现在换成了三堆,其实对于n堆都一样一堆的情况 如果最后二进制每位数的1 ...

  6. android 在一个应用中启动另一个应用

    在程序开发过程当中,常遇到需要启动另一个应用程序的情况,比如在点击软件的一个按钮可以打开地图软件. 如果既有包名又有主类的名字,那就好 办了, 直接像下面就行: [html]  Intent inte ...

  7. C#解决窗体全屏遮住任务栏

    this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea; 在初始话后添加这个即可实现,...............

  8. springMVC validator验证的使用

    http://blog.csdn.net/miketom155/article/details/45058195 1. 实现Validator接口,对数据进行校验 @RequestMapping(va ...

  9. Jquery | 基础 | 属性过滤选择器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. jquery html() 和text()的用法

    html()类似JS中的 innerHTML,首先看一段代码: <!DOCTYPE html> <html lang="en"> <head> ...