catch the cow初次学习广搜题解傻瓜式注释


#include<stdio.h>
#include<string.h>
const int maxn=100001;
bool vis[maxn];//记录是否遍历过
int n,k; //n为人位置,k为牛位置
struct Node
{
    int x,step; //x记录现在的位置,step记录现在的步数
};
Node q[maxn];	//记录走路历程的数组
int bfs()
{
    int i;
    Node now,next;	//now记录现在时刻状态,可以不用now直接使用head,在循环最后加head++.
    //next记录,下一阶段要经历的状态
    int head,tail; //head队首元素,tail是下一个要检查的元素
    head=tail=0; //因tail元素还没赋值现将二者初始化为零相等
    q[tail].x=n;//
    q[tail].step=0;tail++;//tail元素赋值,并让tail成为下一元素,原tail元素成为队首元素
    vis[n]=true;//将遍历记录数组全初始化为可遍历状态即未曾到过这个遍历点
    //这个这个数组要理解是记录什么的,每一个点都代表着这个位置,被遍历过成为不可遍历状态后即认为从起点到达这个点的最短次数已经确定,所以后面无论什么方法到达这里都会比初始方法快捷,所以不必再遍历这个点.
    while(head<tail)//我的理解相当于是无限循环,直到找到最优解主动跳出循环.
    {
        now=q[head];//此处可改,为了观赏效果,用now承接队首元素数据
        head++;
        for(i=0;i<3;i++)//一共有三种走法,所以循环三次每一次都代表不同走法
        {
            if(i==0) next.x=now.x-1;
            else if(i==1) next.x=now.x+1;
            else next.x=2*now.x;//三种走法对坐标的改变,用next承接改变后的数据
            if(next.x<0 || next.x>=maxn) continue;
            //用来限制条件排除越界,这个剪枝的意思大概就是让已经知道没用的解就直接别浪费时间算下去了
            if(!vis[next.x])//这一步就体现到这个数组的理解了,只记录第一个到这一位置的走法
            {
                vis[next.x]=true;//将这一位置设为不可遍历状态
                next.step=now.step+1;//到了这一位置,所以步数比上一次加一
                q[tail].x=next.x;q[tail].step=next.step;tail++;
                //tail记录的是下一个要被用作当前状态(即下一个head)的元素,所以用它承接next的值,同时++
                if(next.x==k) return next.step;
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        memset(vis,false,sizeof(vis));
        if(n>=k) printf("%d\n",n-k);
        else printf("%d\n",bfs());
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值