uva 11624 Fire!(bfs)
来源:互联网 发布:湘潭大学网络教育 编辑:程序博客网 时间:2024/05/17 00:12
题意:Joe和火在一个迷宫中,Joe和火每分钟可以走到上下左右四个方向相邻的格子,迷宫存在一些障碍物,Joe和火都无法进入,只要Joe走到迷宫边界就算他走出了迷宫,如果Joe能走出迷宫输出最短的时间,否则输出IMPOSSIBLE。
分析:Joe和火相当于多个起点,分别将Joe和火添加到队列中,然后进行BFS,让Joe先走,然后用vis数组将当前位置标记为1,随后让火走,如果当前位置没走过,则直接把vis数组标记为2,如果当前位置Joe走过,也把vis数组标记为2。如果从队列中取出一点,并且这点是Joe在走,但是当前位置已经被火走过了,则说明当前位置不可走,直接将该点舍弃。最后若Joe走到边界,就返回步数,若队列为空,则说明不可达。
AC代码:
#include <algorithm>#include <iostream>#include <sstream>#include <cstdio>#include <vector>#include <cctype>#include <stack>#include <queue>#include <map>#include <set>using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1005;struct node{int i,j;int d;int f;//1人,2火 node(int _i, int _j, int _d, int _f){i = _i, j = _j, d = _d, f = _f;}};int dx[4] = {1,-1,0,0};int dy[4] = {0,0,-1,1};int n,m;char maze[maxn][maxn];int vis[maxn][maxn];//0未走,1人走过,2火烧 void input(){scanf("%d%d",&n,&m);for(int i = 0; i <= n+1; i++){for(int j = 0; j <= m+1; j++){vis[i][j] = 0;maze[i][j] = 0;}}for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin>>maze[i][j];}}}int solve(){queue<node> q;for(int i = 1; i <= n; i++){//让joe先走 for(int j = 1; j <= m; j++){if(maze[i][j] == 'J'){q.push(node(i,j,0,1));vis[i][j] = 1;break;}}}for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(maze[i][j] == 'F') {q.push(node(i,j,0,2));vis[i][j] = 2;}}}int cnt = 1;//记录joe还有多少选择 while(1){if(q.empty()) return 0;node t = q.front(); q.pop();if(cnt == 0) return 0;//joe无路可走了 if(t.f == 1) cnt--;//当前这个地方已被火烧了 if(t.f == 1 && vis[t.i][t.j] == 2) continue;for(int i = 0; i < 4; i++){node ti(t.i+dx[i],t.j+dy[i],t.d+1,t.f);if(ti.f == 1){//是Joeif(ti.i == 0 || ti.i == n+1) return ti.d;if(ti.j == 0 || ti.j == m+1) return ti.d;}if(vis[ti.i][ti.j] == 0 && maze[ti.i][ti.j] == '.'){if(ti.f == 1) cnt++;vis[ti.i][ti.j] = ti.f;q.push(ti);}else if(vis[ti.i][ti.j] == 1 && maze[ti.i][ti.j] == '.' && ti.f == 2){vis[ti.i][ti.j] = 2;q.push(ti);}}}}int main(){int t;scanf("%d",&t);while(t--){input();int d = solve();if(d == 0) puts("IMPOSSIBLE");else printf("%d\n",d);}return 0;}
0 0
- UVA 11624 BFS Fire
- UVa Fire! 11624 (BFS)
- uva 11624 - Fire! bfs
- UVa 11624 Fire! / BFS
- UVa 11624 Fire! bfs
- uva 11624 - Fire!(BFS)
- UVA - 11624 Fire! BFS
- uva 11624Fire! (bfs)
- 【UVA】 11624 Fire!【BFS】
- UVA 11624 - Fire!(BFS)
- uva 11624 Fire!(bfs)
- uva 11624 Fire (BFS)
- BFS-UVA-11624-Fire!
- UVA 11624-Fire!-BFS-
- UVa 11624 Fire! ( BFS )
- UVA 11624 Fire!【BFS】
- UVA 11624 fire! (bfs)
- UVa -11624 Fire -bfs
- Java反射机制
- Makefile 使用笔记【2】
- iOS 编程之 Xcode6 上配置国际化
- 【c++ primer读书笔记】【第11章】关联容器
- 关于使用百度地图的IOS SDK 的注意事项
- uva 11624 Fire!(bfs)
- UVa679(二叉完全树)
- 简单的案例解析Java反射机制
- 第三周项目3--程序的多文件组织
- JavaScript 语法集锦
- CodeBlocks里设置全局变量
- WorkPlanning_1
- QxOrm 1.2.9 下载 以及编译方法 简介.
- Linux开启mysql远程连接