传送门:(百度下题意吧)
题意没说明白其实可能有多个火源,所以BFS的时候先把所有点火能到达的最小时间记录这里我用了tie数组,为了防超时要把所有火的位置一次性丢进队列里然后BFS,再和人能到达各个点的时间比较,只有人到达的时间小于火能到达的最小值人才能走到这个点。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <algorithm>
#define inf 0x3f3f3f
using namespace std;
char m[1005][1005];
int vis[1005][1005];
int tie[1005][1005];
int dir[4][2]= {1,0,-1,0,0,-1,0,1};
int x,y;
struct node
{
int xx,yy;
int step;
};
queue<node>q;
int bfs2(int x2,int y2)
{
node cur,next;
cur.xx=x2;
cur.yy=y2;
cur.step=0;
vis[cur.xx][cur.yy]=1;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0; i<4; i++)
{
next.xx=cur.xx+dir[i][0];
next.yy=cur.yy+dir[i][1];
next.step=cur.step+1;
if(next.xx>=0&&next.xx<x&&next.yy>=0&&next.yy<y&&
m[next.xx][next.yy]=='.'&&vis[next.xx][next.yy]==0
&&next.step<tie[next.xx][next.yy])
{
vis[next.xx][next.yy]=1;
if(next.xx==0||next.xx==(x-1)||next.yy==0||next.yy==(y-1))
return next.step;
q.push(next);
}
}
}
return 0;
}
int bfs1()
{
node cur,next;
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0; i<4; i++)
{
next.xx=cur.xx+dir[i][0];
next.yy=cur.yy+dir[i][1];
if(next.xx>=0&&next.xx<x&&next.yy>=0&&next.yy<y
&&m[next.xx][next.yy]=='.'&&vis[next.xx][next.yy]<vis[cur.xx][cur.yy])
{
vis[next.xx][next.yy]++;
next.step=cur.step+1;
tie[next.xx][next.yy]=min(tie[next.xx][next.yy],next.step);
q.push(next);
}
}
}
return 0;
}
int main()
{
int t;
int xx1,yy1;
scanf("%d",&t);
while(t--)
{
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
memset(tie,inf,sizeof(tie));
scanf("%d%d",&x,&y);
for(int i=0; i<x; i++)
{
scanf("%s",m[i]);
}
for(int i=0; i<x; i++)
{
for(int j=0; j<y; j++)
{
if(m[i][j]=='F')
{
node cur;
cur.xx=i;
cur.yy=j;
cur.step=0;
vis[i][j]=9999;
q.push(cur);
}
if(m[i][j]=='J')
{
xx1=i;
yy1=j;
}
}
}
if(xx1==0||xx1==(x-1)||yy1==0||yy1==(y-1))
printf("1\n");
else
{
bfs1();
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
int ans=bfs2(xx1,yy1);
if(ans==0)
printf("IMPOSSIBLE\n");
else
printf("%d\n",ans+1);
}
}
return 0;
}
</span>