BFS - Catch That Cow

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.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
struct point
{
    int x,step;
} st;
queue <point> q;//结构体队列
int vis[200000];//标记数组,判断这个点是否走过。
int n, m;
int flat;
int bfs()
{
    while (!q.empty())//每一次都将队列里面的数清空
    {
        q.pop();   //将队列里的数清空
    }

    memset(vis, 0, sizeof(vis));  //vis数组中的数都赋值为0
    vis[st.x]=1;//牧场主开始的位置标记,代表不会走回来
    q.push(st);//在队列尾部添加起点数据
    while (!q.empty())//当队列中还有数存在是时候,一直循环
    {

        point now = q.front();//定义一个结构体now==队列的头部数据
        if(now.x==m)        //说明牧场主走到了牛的位置
            return now.step;//当一开始,牧场主和牛的位置一样的时候,就直接返回。这个不要忘记
        q.pop();            //删除队列头部数据
        for (int j=0; j<3; j++) //三种情况的循环
        {
            point next=now;

            if (j==0)
            {
                next.x=next.x+1;
            }
            else if (j==1)
            {
                next.x=next.x-1;
            }
            else if (j==2)               
            {
                next.x=next.x*2;
            }
            ++next.step;
            if (next.x==m)
            {
                return next.step;
            }
            if (next.x>=0 && next.x<=200000 && !vis[next.x])//判断是否越界
            {
                vis[next.x]=1;//牧场主next的位置标记,代表不会走回来
                q.push(next);  //如果next的位置没有被走过且没有越界就入队
            }
        }
    }
    return 0;
}
int main()
{
    while (~scanf("%d %d", &n, &m))
    {
        st.x = n;
        st.step=0;
        printf("%d\n", bfs());
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/wqn20172674/article/details/79679453