AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
struct node{
int x,y;
int t;
bool operator < (const node &a)const{
return t > a.t;
}
};
const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
int n,m;
char maze[1005][1005];
int visj[1005][1005],visf[1005][1005];
void bfs1(){
memset(visf,-1,sizeof(visf));
node cur;
queue<node> q;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(maze[i][j] == 'F'){
visf[i][j] = 0;
q.push(node{i,j,0});
}
}
}
while(!q.empty()){
cur = q.front();
q.pop();
for(int i = 0; i < 4; i++){
int xx = cur.x+dx[i],yy = cur.y+dy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= m || visf[xx][yy] != -1)
continue;
if(maze[xx][yy] != '#'){
visf[xx][yy] = visf[cur.x][cur.y]+1;
q.push(node{xx,yy,visf[xx][yy]});
}
}
}
}
int bfs2(int x,int y){
memset(visj,-1,sizeof(visj));
node cur;
visj[x][y] = 0;
priority_queue<node> q;
q.push(node{x,y,0});
while(!q.empty()){
cur = q.top();
q.pop();
if(cur.x == 0 || cur.x == n-1 || cur.y == 0 || cur.y == m-1){
return cur.t+1;
}
for(int i = 0; i < 4; i++){
int xx = cur.x+dx[i],yy = cur.y+dy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= m || visj[xx][yy] != -1)
continue;
if(visf[xx][yy] != -1 && visj[cur.x][cur.y]+1 >= visf[xx][yy])
continue;
if(maze[xx][yy] != '#'){
visj[xx][yy] = visj[cur.x][cur.y]+1;
q.push(node{xx,yy,visj[xx][yy]});
}
}
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int jx,jy,fx,fy;
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++){
scanf("%s",maze[i]);
for(int j = 0; j < m; j++){
if(maze[i][j] == 'J'){
jx = i;jy = j;
}
}
}
bfs1();//模拟火蔓延,尼玛这题有毒呀,火的位置不止一个
int ans = bfs2(jx,jy);//模拟人
if(ans < 0)
printf("IMPOSSIBLE\n");
else
printf("%d\n",ans);
}
return 0;
}