第一次bfs一次记录起火的时间,第二次对人bfs,再多一个对于着火时间的判断。
一开始没读明白题,以为只有一个F点,最后发现可能有多个。
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<cmath>
#include<string.h>
using namespace std;
#define ll long long
int r,c,sx,sy;
int T[1010][1010],vf[1010][1010],vm[1010][1010];
char g[1010][1010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct node{
int x,y,t;
node(int X,int Y,int T){
x=X;
y=Y;
t=T;
}
};
queue<node> qf;
void bfs1()
{
while(!qf.empty()){
node u=qf.front();
qf.pop();
node v=u;
for(int i=0;i<4;i++){
int tx=u.x+dx[i];
int ty=u.y+dy[i];
if(tx<0||tx>=r||ty<0||ty>=c||g[tx][ty]=='#') continue;
if(!vf[tx][ty]){
vf[tx][ty]=1;
v.x=tx;
v.y=ty;
v.t=u.t+1;
T[tx][ty]=v.t;
qf.push(v);
}
}
}
}
int bfs2()
{
queue<node> q;
while(!q.empty()) q.pop();
node t(sx,sy,0);
q.push(t);
memset(vm,0,sizeof vm);
vm[sx][sy]=1;
while(!q.empty()){
node u=q.front();
q.pop();
if(u.x==0||u.x==r-1||u.y==0||u.y==c-1){
return u.t+1;
}
node v=u;
for(int i=0;i<4;i++){
int tx=u.x+dx[i];
int ty=u.y+dy[i];
if(tx<0||tx>=r||ty<0||ty>=c||g[tx][ty]=='#') continue;
if(u.t+1>=T[tx][ty]) continue;
if(!vm[tx][ty]){
vm[tx][ty]=1;
v.x=tx;
v.y=ty;
v.t=u.t+1;
q.push(v);
}
}
}
return -1;
}
int main()
{
int _;
scanf("%d",&_);while(_--)
{
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++)
scanf("%s",g[i]);
memset(vf,0,sizeof vf);
memset(T,1,sizeof T);
while(!qf.empty()) qf.pop();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
if(g[i][j]=='J'){
sx=i,sy=j;
}
if(g[i][j]=='F'){
node tmp(i,j,0);
vf[i][j]=1;
T[i][j]=0;
qf.push(tmp);
}
}
bfs1();
int ans=bfs2();
if (ans == -1)
printf("IMPOSSIBLE\n");
else
printf("%d\n", ans);
}
}