• BFS


    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
    ", bfs());
        }
     
        return 0;
    }
  • 相关阅读:
    BIEE变量总结
    微信支付回调问题
    内网搭建WEB服务器教程(转载)
    c#简体繁体转换
    js页面之间函数调用
    数据库性能优化一:SQL索引一步到位
    EasyUI兼容IE问题
    SQL函数说明大全
    经典SQL语句大全(绝对的经典)
    Sql Server 常用系统存储过程大全
  • 原文地址:https://www.cnblogs.com/20172674xi/p/9529253.html
Copyright © 2020-2023  润新知