简单的bfs求最短路径问题
本题须经过两步bfs,一步是扩展着火点,第二步是判断人的逃离路径是否小于该点的着火时间
#include <stdio.h>
#include <string.h>
#define inf 0x3f3f3f3f
typedef struct
{
int x;
int y;
} node;
node q[1000010];
char map[1010][1010];
int vis[1010][1010],fi[1010][1010],dis[1010][1010];
int dx[4]= {1,0,-1,0};
int dy[4]= {0,-1,0,1};
int flag,ans,m,n;
int fire()
{
int front=0,rear=0;
node f;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(map[i][j]=='F')
{
vis[i][j]=1;
f.x=i;
f.y=j;
fi[i][j]=0;
q[rear++]=f;
}
while(front<rear)
{
f=q[front++];
for(int i=0; i<4; i++)
{
node u;
u.x=f.x+dx[i];
u.y=f.y+dy[i];
if(u.x<0||u.x==m||u.y<0||u.y==n||fi[u.x][u.y]!=inf||vis[u.x][u.y]||map[u.x][u.y]=='#')continue;
fi[u.x][u.y]=fi[f.x][f.y]+1;
q[rear++]=u;
vis[u.x][u.y]=1;
}
}
}
int bfs()
{
int front=0,rear=0;
node f;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(map[i][j]=='J')
{
vis[i][j]=1;
f.x=i;
f.y=j;
dis[i][j]=0;
q[rear++]=f;
}
while(front<rear)
{
f=q[front++];
for(int i=0; i<4; i++)
{
node u;
u.x=f.x+dx[i];
u.y=f.y+dy[i];
int d=dis[f.x][f.y];
if(u.x<0||u.x==m||u.y<0||u.y==n)
{
flag=1;
ans=d+1;
return 0;
}
if(dis[u.x][u.y]!=inf||d+1>=fi[u.x][u.y]||map[u.x][u.y]=='#')continue;
vis[u.x][u.y]=1;
dis[u.x][u.y]=d+1;
q[rear++]=u;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=0; i<m; i++)
{
scanf("%s",map[i]);
}
memset(vis,0,sizeof(vis));
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
fi[i][j]=inf;
dis[i][j]=inf;
}
fire();
flag=0;
memset(vis,0,sizeof(vis));
bfs();
if(!flag)
{
printf("IMPOSSIBLE\n");
}
else printf("%d\n",ans);
}
return 0;
}