• AcWing 1100. 抓住那头牛 BFS


    地址 https://www.acwing.com/problem/content/description/1102/

    农夫知道一头牛的位置,想要抓住它。
    
    农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。
    
    农夫有两种移动方式:
    
    从 X 移动到 X−1 或 X+1,每次移动花费一分钟
    从 X 移动到 2∗X,每次移动花费一分钟
    假设牛没有意识到农夫的行动,站在原地不动。
    
    农夫最少要花多少时间才能抓住牛?
    
    输入格式
    共一行,包含两个整数N和K。
    
    输出格式
    输出一个整数,表示抓到牛所花费的最少时间。
    
    数据范围
    0≤N,K≤105
    输入样例:
    5 17
    输出样例:
    4

    解答

    算法1
    常规BFS 需要注意的是x=x2需要进行限制否则会向不可能得到答案的方向不断增长
    x=x2 必须小于 2*k

    // 11123.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <queue>
    #include <set>
    
    
    using namespace std;
    
    int n, m;
    
    set<int> vis;
    
    int main()
    {
        cin >> n >> m;
    
        queue<pair<int, int>> q;
    
        q.push({ n,0 });
        vis.insert(n);
    
        if (m <= n) {
            cout << n - m;
            return 0;
        }
    
        while (q.size()) {
            int t = q.front().first;
            int step = q.front().second;
            q.pop();
    
            int next1 = t - 1;
            int next2 = t + 1;
            int next3 = t * 2;
    
            if (next1 == m || next2 == m || next3 == m) {
                cout << step + 1 << endl;
                return 0;
            }
            if(vis.count(next1) == 0){
                q.push({ next1,step + 1 });
                vis.insert(next1);
            }
            if ( vis.count(next2) == 0) {
                q.push({ next2,step + 1 });
                vis.insert(next2);
            }
            if( next3 < 2*m && vis.count(next3) == 0){
                q.push({ next3,step + 1 });
                vis.insert(next3);
            }
        }
    
    
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    钞票与选票之争
    poj1066--Treasure Hunt(规范相交)
    mmc生产任务分配问题
    Linux学习杂记
    UVA 10026 Shoemaker&#39;s Problem
    【12c】root container 和 pdb 的一些差别
    Configuring HDFS High Availability
    字符串替换
    一张图搞懂分布式大型站点的前世今生
    HDU1874畅通project续 dijkstra&amp;&amp;floyd
  • 原文地址:https://www.cnblogs.com/itdef/p/13428023.html
Copyright © 2020-2023  润新知