(bfs)1028Catch That Cow

来源:互联网 发布:二维码生成源码 编辑:程序博客网 时间:2024/06/05 10:47

Catch That Cow


Problem 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 X - 1 or X + 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.

Example Input

5 17

Example Output

4

解题思路
两种交通方式,三种走法,即点可能存在的三种邻接点。


代码

#include<stdio.h>#include<cstring>#include<queue>using namespace std;typedef struct Node{    int num,step;}Node;int visited[100001],k;int Check(int t)//检查结点的合法性{    if(t<0||t>100000||visited[t]==1)    /*注意点:if(visited[t]==1||t<0||t>100000)这种情况就报错,    如果t<0||t>100000,visited[t]就存在越界错误*/        return 0;    return 1;}void BFS(int n){    queue<Node>q;    Node fir;    fir.num=n;    fir.step=0;    visited[n]=1;    q.push(fir);    while(!q.empty())    {        Node tmp,nxt;        tmp=q.front();       // printf("num=%d\n",tmp.num);        q.pop();        if(tmp.num==k)        {            printf("%d\n",tmp.step);            return;        }        nxt.num=tmp.num+1;        if(Check(nxt.num))        {            nxt.step=tmp.step+1;            visited[nxt.num]=1;            q.push(nxt);        }         nxt.num=tmp.num-1;        if(Check(nxt.num))        {            nxt.step=tmp.step+1;            visited[nxt.num]=1;            q.push(nxt);        }         nxt.num=tmp.num*2;        if(Check(nxt.num))        {            nxt.step=tmp.step+1;            visited[nxt.num]=1;            q.push(nxt);        }    }}int main(){    int n;    scanf("%d%d",&n,&k);    memset(visited,0,sizeof(visited));    BFS(n);    return 0;}