http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=116#problem/A
题意:帮助joe走出一个大火蔓延的迷宫,他每分钟可以走上下左右四个方向之一,而所有着火的格子都会往四周蔓延。joe和火都无法进入障碍格。当joe走到迷宫的边界格子时我们认为他已经走出迷宫.输出joe走出迷宫的最少时间,若无法走出,输出“IMPOSSIBLE”.
思路:两次bfs。因为火是不能熄灭的,当某个格子某时刻着了火,以后会一直着火。所以我们用bfs处理每个格子着火的时刻。在第二次bfs的时候只需判断joe到达该格子的时间是否小于该格子着火的时间即可。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#define LL long long
#define _LL __int64
using namespace std;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
struct node
{
int x,y;
int step;
};
queue <node> que;
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int jx,jy;
char map[maxn][maxn],s[maxn];
int time[maxn][maxn],vis[maxn][maxn];
int n,m;
int ans;
//预处理每个格子(不是障碍格)着火的时刻
void solve()
{
memset(vis,0,sizeof(vis));
memset(time,INF,sizeof(time));
while(!que.empty()) que.pop();
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
if(map[i][j] == 'F')
{
que.push((struct node){i,j,1});
time[i][j] = 1;
vis[i][j] = 1;
}
}
while(!que.empty())
{
struct node u = que.front();
que.pop();
for(int d = 0; d < 4; d++)
{
int x = u.x + dir[d][0];
int y = u.y + dir[d][1];
if(x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] != '#' && !vis[x][y])
{
vis[x][y] = 1;
que.push((struct node){x,y,u.step+1});
time[x][y] = u.step+1;
}
}
}
}
//寻找joe出口的最短路径
bool bfs()
{
memset(vis,0,sizeof(vis));
while(!que.empty()) que.pop();
vis[jx][jy] = 1;
que.push((struct node){jx,jy,1});
while(!que.empty())
{
struct node u = que.front();
que.pop();
if(u.x == 1 || u.x == n || u.y == 1 || u.y == m)
{
ans = u.step;
return true;
}
for(int d = 0; d < 4; d++)
{
int x = u.x + dir[d][0];
int y = u.y + dir[d][1];
if(x >= 1 && x <= n && y >= 1 && y <= m && map[x][y] != '#' && !vis[x][y])
{
if(u.step + 1 < time[x][y]) //只有当该格子没着火才进队列
{
time[x][y] = 1;
que.push((struct node){x,y,u.step+1});
}
}
}
}
return false;
}
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++)
{
scanf("%s",map[i]+1);
for(int j = 1; j <= m; j++)
if(map[i][j] == 'J')
{
jx = i;
jy = j;
}
}
solve();
if(bfs())
printf("%d\n",ans);
else printf("IMPOSSIBLE\n");
}
return 0;
}