Catch That Cow POJ - 3278

3 篇文章 0 订阅
在很久很久以前,有一位大师级程序员,实力高强,深不可测,代码能力无人能及。从来没有人听说过他的真名,只知道他在完成一段代码后,总会跟上一行注释“十四出品,必属精品”,于是他在编程江湖上便有了绰号“十四”。


  然而,十四大师并不满足于现有的一切,他想要让自己的实力有更进一步的提升。为此,他专程前往二次元世界修行。


  二次元旅程归来的十四大师学习了新的技能——闪现。


  在一条既定的直线道路上,“闪现”技能允许十四大师超时空移动。如果把道路视为一条数轴,使用闪现可以让十四大师瞬间移动到脚下坐标两倍的位置上。例如,如果十四大师站在坐标5的位置上,他可以直接闪现到坐标10的位置,如果继续闪现,则可以到达坐标20的位置上。


  现在十四大师打算练习一下“闪现”在生活中的应用。我们假定他站在坐标为a的位置上,而他想要到达坐标为b的位置(0 ≤a,b≤100000)。除了使用闪现外,他也可以像常人一样徒步向前或者向后走,而使用闪现视为行走了一步。请问十四大师最少需要走多少步才可以到达目标?


Input
  输入包含多组数据。每组数据占一行,包含两个整数a和b,表示十四大师的起始坐标和目的地坐标。(0 ≤a,b≤100000)


Output
  对于每组输入,输出一个整数,即十四大师到达目的地的最少步数。


Sample Input
5 17


Sample Output
4


Hint

  对于样例数据,最少步数的走法是:从坐标5闪现到坐标10,后退一步到坐标9,再闪现到坐标18,最后后退一步即到达坐标17。总共四步。

wa:

1.要考虑k==n的情况

2.要减枝,k.x<ku,否则RE

3.k.x-1时要考虑是否越界。

ac代码

# include <iostream>
# include <algorithm>
# include <cstring>
# include <cstdio>
# include <queue>
using namespace std;


struct node
{
    long long num,x;
};


long long n,ku;
queue<node>pd;
int a[200050];


void bfs()
{
    while (!pd.empty())
    {
        node k=pd.front();
        pd.pop();
        if (k.x==ku)
        {
            cout << k.num <<endl;
            break;
        }
        if ((k.x+1==ku)||(k.x-1==ku)||(k.x*2==ku))
        {
            cout << k.num+1 <<endl;
            break;
        }
        else
        {
            if (a[k.x-1]==0&&k.x-1>=0)
            {
                node s;
                s.num=k.num+1;
                s.x=k.x-1;
                pd.push(s);
                a[k.x-1]=1;
            }
            if (k.x<ku&&a[k.x+1]==0)
            {
                node s;
                s.num=k.num+1;
                s.x=k.x+1;
                pd.push(s);
                a[k.x+1]=1;
            }
            if (k.x<ku&&a[k.x*2]==0)
            {
                node s;
                s.num=k.num+1;
                s.x=k.x*2;
                pd.push(s);
                a[k.x*2]=1;
            }


        }
    }
    return ;
}


int main ()
{
    while (cin >> n >> ku)
    {
        memset (a,0,sizeof(a));
        while (!pd.empty())
            pd.pop();
        node k;
        k.num=0;
        k.x=n;
        pd.push(k);
        a[n]=1;
        bfs();
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值