题意;
在一个迷宫中有好多处起火点,火灾一分钟内会向四周蔓延;
求John能否逃出迷宫,能逃出来的话,输出最短时间;
先预处理下火蔓延到点上的时间(用一个队列来处理)
然后就是最短路问题;
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
char map[1005][1005];
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
int firetime[1005][1005];//预处理火势蔓延的时间
int vis[1005][1005];//访问的时间
struct node
{
int x;
int y;
};
int n,m;
queue<node>q1;
queue<node>q2;
void bfs1()
{
node now;
while(!q1.empty())
{
now=q1.front();
q1.pop();
//cout<<now.x<<endl;
for(int i=0;i<=3;i++)
{
int x1=now.x+dx[i];
int y1=now.y+dy[i];
if(x1<=n&&x1>=1&&y1<=m&&y1>=1&&(map[x1][y1]=='.'||map[x1][y1]=='J')&&firetime[x1][y1]==-1)
{
node k1;
firetime[x1][y1]=firetime[now.x][now.y]+1;
// cout<<x1<<" "<<y1<<" "<<firetime[x1][y1]<<endl;
k1.x=x1;
k1.y=y1;
q1.push(k1);
}
}
}
}
void bfs2()
{
node now;
while(!q2.empty())
{
now=q2.front();
q2.pop();
if(now.x==1||now.x==n||now.y==1||now.y==m)
{
cout<<vis[now.x][now.y]+1<<endl;
return ;
}
for(int i=0;i<=3;i++)
{
int x1=now.x+dx[i];
int y1=now.y+dy[i];
if(x1<=n&&x1>=1&&y1<=m&&y1>=1&&map[x1][y1]=='.'&&vis[x1][y1]==-1)
{
if(firetime[x1][y1]==-1)//
{
node k1;
//cout<<vis[now.x][now.y]<<" "<<firetime[x1][y1]<<endl;
vis[x1][y1]=vis[now.x][now.y]+1;
k1.x=x1;
k1.y=y1;
q2.push(k1);
}
else
{
if(vis[now.x][now.y]<firetime[x1][y1]-1)
{
node k1;
//cout<<vis[now.x][now.y]<<" "<<firetime[x1][y1]<<endl;
vis[x1][y1]=vis[now.x][now.y]+1;
k1.x=x1;
k1.y=y1;
q2.push(k1);
}
}
}
}
}
cout<<"IMPOSSIBLE"<<endl;
}
int main()
{
int case1;
cin>>case1;
while(case1--)
{
cin>>n>>m;
int i,j;
node people,fire;
memset(firetime,-1,sizeof(firetime));
memset(vis,-1,sizeof(vis));
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='F')
{
fire.x=i;
fire.y=j;
q1.push(fire);
firetime[i][j]=0;
}
else
{
if(map[i][j]=='J')
{
people.x=i;
people.y=j;
q2.push(people);
vis[i][j]=0;
}
}
}
}
bfs1();
bfs2();
}
}