bfs入门 hdu 1548 a strange lift

本文介绍了一种基于广度优先搜索(BFS)算法的应用实例,并详细解释了如何避免重复访问节点导致的死循环问题。通过使用标志数组跟踪已访问状态,确保了算法的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和一般图上的bfs有些不同,思路上稍微有点复杂,说一下自己的理解吧。对于某种选择到达的状态如果之前已经到达过则这种选择是不应该选的,对应到一般图上如果该节点已被访问则不把该点写入队列。这点明白了,这题就没问题了。

把每个点设一个标志数组,如果该层已被访问则不写入队列,这样保证程序不会陷入死循环。

 

#include<stdio.h>
#include<string.h>
int s[210],quene[1000000][2],head,tail,n,a,b;
bool t[210];
void visit(int floor)
{
    quene[tail][0]=floor;
    quene[tail++][1]=quene[head-1][1]+1;
    t[floor]=1;
}
void bfs()
{
    int floor,pre,i;
    quene[0][0]=a;
    quene[0][1]=0;
    t[a]=1;//保证不会进入死循环
    while(head!=tail)
    {
        floor=quene[head++][0];
        if(floor==b)
            break;
        if(floor+s[floor-1]<=n&&floor+s[floor-1]>0&&!t[floor+s[floor-1]])
            visit(floor+s[floor-1]);
        if(floor-s[floor-1]>0&&floor-s[floor-1]<=n&&!t[floor-s[floor-1]])
            visit(floor-s[floor-1]);
    }
    if(floor==b)
        printf("%d\n",quene[head-1][1]);
    else
        printf("-1\n");
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        scanf("%d%d",&a,&b);
        head=0;tail=1;
        memset(quene,0,sizeof(quene));
        memset(s,0,sizeof(s));
        memset(t,0,sizeof(t));
        for(int i=0;i<n;++i)
            scanf("%d",&s[i]);
        bfs();
    }
    return 0;
}

 

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值