11624 - Fire! Time limit: 1.000 seconds |
#include <cstdio>
#include <cstring>
const int MAXN = 1001;
struct point
{
int x, y,step;
bool fire;// 迷宫搜索到的位置是否着火
} que[MAXN*MAXN];
int r, c, fx, fy;
int dx[4]= {1,-1,0,0};
int dy[4]= {0,0,1,-1};
char map[MAXN][MAXN];
bool vis[MAXN][MAXN];
int bfs()
{
int front=0, rear=0;
memset(vis, false, sizeof(vis));
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)// '火'进队列(注意:初始时不止一个位置‘起火’),我开始忘记写成单个的了
if(map[i][j]=='F')
{
que[rear].x = j;//人在迷宫 里左右搜索的时候,相当于在列间移动,我当时写的时候,老是就迷糊,转不过来
que[rear].y = i;
que[rear].step = 0;
que[rear].fire = true;
++rear;
}
que[rear].x=fx;// '人'进队列
que[rear].y=fy;
que[rear].step = 0;
que[rear++].fire = false;
while(front<rear)
{
int xx = que[front].x;
int yy = que[front].y;
if(que[front].fire)// 对‘火’进行扩展,向4个方向拓展
{
for(int i=0; i<4; i++)
{
xx = que[front].x + dx[i];
yy = que[front].y + dy[i];
if(xx<0||xx>=c||yy<0||yy>=r||map[yy][xx]=='#'||map[yy][xx]=='F')
continue;
map[yy][xx] = 'F';
que[rear].x = xx;
que[rear].y = yy;
que[rear].fire = true;
que[rear].step = que[front].step+1;
++rear;
}
}
else
{
for(int i=0; i<4; i++)// 对‘人’进行扩展
{
int xx = que[front].x + dx[i];
int yy = que[front].y + dy[i];
if(vis[yy][xx]||map[yy][xx]=='#'||map[yy][xx]=='F')
continue;
if(xx<0||xx>=c||yy<0||yy>=r)
return que[front].step+1;
vis[yy][xx] = true;
que[rear].x = xx;
que[rear].y = yy;
que[rear].fire = false;
que[rear].step = que[front].step+1;
++rear;
}
}
++front;
}
return 0;
}
int main()
{
int t, flag;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &r, &c);
fx = fy = -1;
for(int i=0; i<r; i++)
{
scanf("%s", map[i]);
if(fx == -1)
for(int j=0; j<c; j++)
if(map[i][j] == 'J')
{
fx = j;
fy = i;
break;
}
}
flag = bfs();
if(flag)
printf("%d\n", flag);
else
printf("IMPOSSIBLE\n");
}
return 0;
}