搜索-G

来源:互联网 发布:python input一个元组 编辑:程序博客网 时间:2024/05/16 11:08

Description

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

* Walking: FJ can move from any point X to the points - 1 or + 1 in a single minute* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input

Line 1: Two space-separated integers: N and K

Output

Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

Sample Input

5 17

Sample Output

4

Hint

The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.
这道题大致的意思就是一个农夫想要去追一个在一个点不动的牛,但是农夫的行动方式只有前后移动一个或者移动两倍于该点的坐标的路程。
下面是我的AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>using namespace std;#define MAX 100005int v[MAX];int cnt;void bfs(int n,int k){    queue<int>q;    q.push(n);    q.push(cnt);    v[n]=1;    while(!q.empty())    {        n=q.front();        q.pop();        cnt=q.front();        q.pop();        if(n==k){break;}        if(n-1>=0&&!v[n-1])        {            q.push(n-1);            q.push(cnt+1);            v[n-1]=1;        }        if(n+1<MAX&&!v[n+1])        {            q.push(n+1);            q.push(cnt+1);            v[n+1]=1;        }        if(2*n<MAX&&!v[2*n])        {            q.push(2*n);            q.push(cnt+1);            v[2*n]=1;        }    }}int main(){    int n,k;    cin>>n>>k;    if(n>=k)    {        cout<<n-k;    }    else    {        cnt=0;        memset(v,0,sizeof(v));        bfs(n,k);        cout<<cnt;    }    return 0;}
原创粉丝点击