原題鏈接:https://vjudge.net/problem/UVA-11624
雙入口同時BFS
#include<bits/stdc++.h>
#define INF 10001010
using namespace std;
char M[1010][1010];
int T[1010][1010];
bool judgej[1010][1010];
bool judgef[1010][1010];
int n,t;
int a,b;
int jx,jy;
struct Node
{
int x,y;
int time;
}nodej,nodef;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
queue<Node> J,F;
int BFS()
{
while(!F.empty())
{
nodef=F.front();
F.pop();
for(int i=0;i<4;i++)
{
int nx=nodef.x+dx[i];
int ny=nodef.y+dy[i];
if(nx>=0&&nx<a&&ny>=0&&ny<b&&M[nx][ny]=='.'&&judgef[nx][ny])
{
Node node;
node.x=nx;
node.y=ny;
node.time=nodef.time+1;
T[nx][ny]=node.time;
F.push(node);
judgef[nx][ny]=false;
}
}
}
nodej.x=jx;
nodej.y=jy;
nodej.time=1;
J.push(nodej);
judgej[jx][jy]=false;
while(!J.empty())
{
nodej=J.front();
if(nodej.x==0||nodej.x==a-1||nodej.y==0||nodej.y==b-1)
break;
J.pop();
for(int i=0;i<4;i++)
{
int nx=nodej.x+dx[i];
int ny=nodej.y+dy[i];
if(nx>=0&&nx<a&&ny>=0&&ny<b&&M[nx][ny]=='.'&&nodej.time+1<T[nx][ny]&&judgej[nx][ny])
{
Node node;
node.x=nx;
node.y=ny;
node.time=nodej.time+1;
J.push(node);
judgej[nx][ny]=false;
}
}
}
if(J.empty())
return -1;
else
return nodej.time;
}
int main()
{
cin>>n;
while(n--)
{
cin>>a>>b;
while(!F.empty())
F.pop();
while(!J.empty())
J.pop();
memset(judgej,true,sizeof(judgej));
memset(judgef,true,sizeof(judgef));
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
T[i][j]=INF;
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
cin>>M[i][j];
if(M[i][j]=='J')
{
jx=i;
jy=j;
M[i][j]='.';
}
if(M[i][j]=='F')
{
M[i][j]='.';
nodef.x=i;
nodef.y=j;
nodef.time=1;
T[i][j]=1;
F.push(nodef);
judgef[i][j]=false;
}
}
int ans=BFS();
if(ans<0)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<ans<<endl;
}
return 0;
}