Catch That Cow POJ - 3278

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


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


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


  在一条既定的直线道路上,“闪现”技能允许十四大师超时空移动。如果把道路视为一条数轴,使用闪现可以让十四大师瞬间移动到脚下坐标两倍的位置上。例如,如果十四大师站在坐标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

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

ac代码

# include
# include
# include
# include
# include
using namespace std;


struct node
{
    long long num,x;
};


long long n,ku;
queuepd;
int a[200050];


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

你可能感兴趣的:(搜索,bfs)