#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#define MAX 1010
using namespace std;
char Map[MAX][MAX];
int Time[MAX][MAX];
bool vis[MAX][MAX];
int r,c;
int dr[]={-1,1,0,0};
int dc[]={0,0,-1,1};
struct P
{
int r,c,t;
P(int r_,int c_,int t_):r(r_),c(c_),t(t_){}
};
queue<P> F;
queue<P> J;
void clear()
{
memset(vis,false,sizeof(vis));
while(!F.empty())
F.pop();
while(!J.empty())
J.pop();
}
bool judge(int nr,int nc)
{
return (nr>=0&&nr<r&&nc>=0&&nc<c);
}
bool ok(int nr,int nc)
{
return (nr==0||nr==r-1||nc==0||nc==c-1);
}
void bfs_f()
{
int nr,nc,nt;
while(!F.empty())
{
P f=F.front();
F.pop();
for(int i=0;i<4;i++)
{
nr=f.r+dr[i];
nc=f.c+dc[i];
nt=f.t+1;
if(judge(nr,nc))
{
if((Map[nr][nc]=='.'||Map[nr][nc]=='J')&&nt<Time[nr][nc])
{
F.push(P(nr,nc,nt));
Time[nr][nc]=nt;
}
}
}
}
}
int bfs_j()
{
int nr,nc,nt;
while(!J.empty())
{
P j=J.front();
J.pop();
if(ok(j.r,j.c))
return j.t+1;
for(int i=0;i<4;i++)
{
nr=j.r+dr[i];
nc=j.c+dc[i];
nt=j.t+1;
if(judge(nr,nc))
{
if(vis[nr][nc]==false&&Map[nr][nc]=='.'&&nt<Time[nr][nc])
{
J.push(P(nr,nc,nt));
vis[nr][nc]=true;
}
}
}
}
return 0;
}
int main()
{
int T,t;
scanf("%d",&T);
while(T--)
{
clear();
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++)
{
scanf("%s",Map[i]);
for(int j=0;j<c;j++)
{
Time[i][j]=1000000007;
if(Map[i][j]=='J')
{
J.push(P(i,j,0));
vis[i][j]=true;
}
else if(Map[i][j]=='F')
F.push(P(i,j,0));
}
}
bfs_f();
if(t=bfs_j())
printf("%d\n",t);
else
printf("IMPOSSIBLE\n");
}
return 0;
}
09-27
462

09-14
345
