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
原创粉丝点击