奇妙的旅行[XDU1012]

Problem 1012 - 奇妙的旅行
Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty:
Total Submit: 396  Accepted: 116  Special Judge: No
Description

  炸鸡儿非常喜欢旅行,而且喜欢在坐标轴上旅行,从起点A到终点B(0<=A,B<=100000)。他旅行的方法很特殊,喜欢用跳的,每次跳一个地方只有三种方法:
从点C跳到点C+1。
从点C跳到点C-1。
从点C跳到点2*C。
请问他从A跳到B至少需要多少步?

Input
每组数据两个整数A,B(0<=A,B<=100000)。
Output
每例输出一行,表示至少需要的步数。
Sample Input
1 100000
0 100000
Sample Output
21
22
Hint
 
Source
Wang Miao
不知为什么,最近特喜欢做这样的水水的bfs.
#include<stdio.h>

#include<string.h>

#include<queue>

using namespace std;

struct node

{

    int val,step;

};

int S,T;

bool s[200010];

int bfs()

{

    memset(s,false,sizeof(s));

    queue<node> q;

    while (!q.empty()) q.pop();

    node st;

    st.val=S;

    st.step=0;

    q.push(st);

    s[S]=true;

    while (!q.empty())

    {

        node st=q.front();

        q.pop();

        if (st.val==T) return st.step;

        if (st.val+1<=T*2)

        if (!s[st.val+1])

        {

            s[st.val+1]=true;

            node tmp=st;

            tmp.step++;

            tmp.val=st.val+1;

            q.push(tmp);

        }

        if (st.val-1>0)

        if (!s[st.val-1])

        {

            s[st.val-1]=true;

            node tmp=st;

            tmp.step++;

            tmp.val=st.val-1;

            q.push(tmp);

        }

        if ((st.val<<1)<=T*2)

        if (!s[st.val<<1])

        {

            s[st.val<<1]=true;

            node tmp=st;

            tmp.step++;

            tmp.val=st.val<<1;

            q.push(tmp);

        }

    }

}

int main()

{

    while (scanf("%d%d",&S,&T)!=EOF)

    {

        if (S>T)

        {

            printf("%d\n",S-T);

            continue;

        }

        int ans=bfs();

        printf("%d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(du)