Files
OI-source/2.11624.cpp
2023-08-03 09:22:52 +08:00

81 lines
1.4 KiB
C++

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define For(i,a,b) for(int i=a;i<=b;++i)
const int maxn=1005;
const int oo=0x3f3f3f3f;
struct Node
{
int r,c,t;
Node(int R,int C,int T):r(R),c(C),t(T) { }
};
queue<Node> Q;
int T,n,m,p[maxn][maxn],vis[maxn][maxn],sr,sc;
int dr[]={0,0,1,-1};
int dc[]={1,-1,0,0};
char mp[maxn][maxn];
void init()
{
while(Q.size())
{
Node u=Q.front();Q.pop();
For(i,0,3)
{
int vr=u.r+dr[i],vc=u.c+dc[i];
if((vr>=1&&vr<=n&&vc>=1&&vc<=m)&&mp[vr][vc]!='#'&&p[vr][vc]==oo)
{
Q.push(Node(vr,vc,0));
p[vr][vc]=p[u.r][u.c]+1;
}
}
}
}
void bfs()
{
while(Q.size()) Q.pop();
Q.push(Node(sr,sc,0));
vis[sr][sc]=1;
while(Q.size())
{
Node u=Q.front();Q.pop();
if(u.r==n||u.r==1||u.c==1||u.c==m) { printf("%d\n",u.t+1); return; }
For(i,0,3)
{
int vr=u.r+dr[i],vc=u.c+dc[i];
if((vr>=1&&vr<=n&&vc>=1&&vc<=m)&&mp[vr][vc]!='#'&&!vis[vr][vc]&&(u.t+1<p[vr][vc]))
{
Q.push(Node(vr,vc,u.t+1));
vis[vr][vc]=1;
}
}
}
puts("IMPOSSIBLE");
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d",&T);
while(T-->0)
{
while(Q.size()) Q.pop();
memset(vis,0,sizeof(vis));
memset(p,oo,sizeof(p));
scanf("%d%d",&n,&m);
For(i,1,n) scanf("%s",mp[i]+1);
For(i,1,n) For(j,1,m)
{
if(mp[i][j]=='F')
{
Q.push(Node(i,j,0));
p[i][j]=0;
}
if(mp[i][j]=='J') sr=i,sc=j;
}
init(); bfs();
}
return 0;
}