狂斌 简单搜索 J - Fire! bfs
题目链接
两个坑
1 多个起火点
2 没有起火点(这种情况把每个点的预处理步数调成超级大就可以了)。
代码如下
#include<stdio.h>
#include<string.h>
struct node{
int x;
int y;
int fstep;
int pstep;
int vit;
}ll[1005000],LL[1005000];
#define INF 1000000;
int m,n,x1,x2,y1,y2,a[4]={1,-1,0,0},b[4]={0,0,1,-1},Fstep[1010][1010];
bool visf[1010][1010],visp[1010][1010];
char mp[1010][1010];
int head=1,tail=1,H=1,T=1,cnt=0;
void bfs()
{
memset(visp,0,sizeof(visp));
head=1;
tail=1;
while(head<=tail)
{
// printf("%d %d\n",ll[head].x,ll[head].y);
int lx=ll[head].x;
int ly=ll[head].y;
visp[lx][ly]=1;
if(lx==n||lx==1||ly==1||ly==m)
{
printf("%d\n",ll[head].pstep+1);
return ;
}
for(int i=0;i<4;i++)
{
int Lx=lx+a[i];
int Ly=ly+b[i];
// printf("%d %d %d %d %d\n",Lx,Ly,Fstep[Lx][Ly],ll[head].pstep+1,head);
if(mp[Lx][Ly]=='.'&&(ll[head].pstep+1<Fstep[Lx][Ly])&&visp[Lx][Ly]==0&&Lx>=1&&Lx<=n&&Ly>=1&&Ly<=m)
{
tail++;
ll[tail].x=Lx;
ll[tail].y=Ly;
ll[tail].pstep=ll[head].pstep+1;
visp[Lx][Ly]=1;
}
}
head++;
}
printf("IMPOSSIBLE\n");
return ;
}
void bfs1()
{
memset(visf,0,sizeof(visf));
while(head<=tail)
{
for(int i=0;i<4;i++)
{
int lx=LL[head].x+a[i];
int ly=LL[head].y+b[i];
if(mp[lx][ly]!='#'&&visf[lx][ly]==0&&lx>=1&&lx<=n&&ly>=1&&ly<=m)
{
tail++;
LL[tail].x=lx;
LL[tail].y=ly;
LL[tail].fstep=LL[head].fstep+1;
Fstep[lx][ly]=LL[tail].fstep;
visf[lx][ly]=1;
}
}
head++;
}
return ;
}
int main()
{
int i,j,k;
scanf("%d",&k);
while(k--)
{
cnt=0;
x1=-1;y1=-1;
memset(Fstep,10005000,sizeof(Fstep));
memset(mp,10,sizeof(mp));
scanf("%d%d",&n,&m);
memset(LL,true,sizeof(LL));
memset(ll,0,sizeof(ll));
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='J')
{
x1=i;
y1=j;
}
if(mp[i][j]=='F')
{
LL[++cnt].x=i;
LL[cnt].y=j;
LL[cnt].fstep=0;
}
}
}
ll[1].x=x1;
ll[1].y=y1;
ll[1].pstep=0;
head=1;
tail=cnt;
if(x1==-1)
printf("IMPOSSIBLE\n");
else
{
bfs1();
bfs();}
}
return 0;
}