宽搜习题(快抓住那头牛)

农夫约翰已经获悉逃跑的牛的位置,想立刻机住它。

农夫的位置在直线上的N(0≤N≤100,00)点,牛在同一直线上的k(0≤k≤10,00)点,约有步行和闪移两种走法。

步行:农夫约翰可以一分钟从点走到x-1或x+1点

闪移:衣夫约翰可以一分钟从点徒到2*x点

假设牛没有意识到农夫的行动,站在原地不动。问:农夫最少需要花多少时间时能机住那头牛?

输入

两个正数N,K(0≤N≤100,000)(0≤K≤100,000)

输出

一个整数,农夫抓住那头牛的最少时间

样例输入

5 17

样例输出

4

代码:

#include<bits/stdc++.h>

using namespace std;

int n,k;

int q[200010][2];

bool vis[200010];

int front,rear;

int main()

{

    cin>>n>>k;

    if(n==k)

    {

        cout<<0;

        return 0;

    }

    front=rear=1;

    q[1][0]=n;

    q[1][1]=0;

    vis[n]=true;

    while(front<=rear)

    {

        int ft=q[front][1];

        int fx=q[front][0];

        int nx=fx-1;

        if(nx>=0 && nx<=100000 && !vis[nx])

        {

            rear++;

            q[rear][0]=nx;

            q[rear][1]=ft+1;

            vis[nx]=true;

            if(nx==k)

            {

                cout<<q[rear][1];

                return 0;

            }

        }

        nx=fx+1;

        if(nx>=0 && nx<=100000 && !vis[nx])

        {

            rear++;

            q[rear][0]=nx;

            q[rear][1]=ft+1;

            vis[nx]=true;

            if(nx==k)

            {

                cout<<q[rear][1];

                return 0;

            }

        }

        nx=fx*2;

        if(nx>=0 && nx<=100000 && !vis[nx])

        {

            rear++;

            q[rear][0]=nx;

            q[rear][1]=ft+1;

            vis[nx]=true;

            if(nx==k)

            {

                cout<<q[rear][1];

                return 0;

            }

        }

        front++;

    }  

    return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值