狂斌 简单搜索 J - Fire! bfs

狂斌 简单搜索 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值