#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char s[1005][1005];
int tag[1005][1005];
int v[1005][1005];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct P{
int x,y,c;
}in,out;
queue<P> que;
int main(){
int t,i,n,m,j,x,y,flag;
scanf("%d",&t);
while(t--){
while(que.size()) que.pop();
memset(s,0,sizeof(s));
memset(v,0,sizeof(v));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%s",&s[i][1]);
for(j=1;j<=m;j++)
tag[i][j]=99999999;
for(j=1;j<=m;j++)
if(s[i][j]=='F'){
x=i,y=j;
v[x][y]=1;
tag[x][y]=0;
que.push((P){x,y,0});
}
}
while(que.size()){
out=que.front();
que.pop();
for(i=0;i<4;i++){
x=out.x+d[i][0];
y=out.y+d[i][1];
if(x>=1 && x<=n && y>=1 && y<=m && v[x][y]==0 && s[x][y]!='#'){
v[x][y]=1;
tag[x][y]=out.c+1;
in=out;
in.c++,in.x=x,in.y=y;
que.push(in);
}
}
}
flag=0;
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(s[i][j]=='J')
x=i,y=j;
v[x][y]=1;
que.push((P){x,y,0});
while(que.size()){
out=que.front();
que.pop();
if(out.x==1 || out.x==n || out.y==1 || out.y==m){
flag=1;
break;
}
for(i=0;i<4;i++){
x=out.x+d[i][0];
y=out.y+d[i][1];
if(x>=1 && x<=n && y>=1 && y<=m && v[x][y]==0 && s[x][y]!='#' && out.c+1<tag[x][y]){
v[x][y]=1;
in=out;
in.c++,in.x=x,in.y=y;
que.push(in);
}
}
}
if(flag) printf("%d\n",out.c+1);
else puts("IMPOSSIBLE");
/*for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
printf("%d ",tag[i][j]);
puts("");
}*/
}
}
沒有留言:
張貼留言