c++最短路模型(抓住那头牛)

先看题目:

农夫知道一头牛的位置,想要抓住它。

农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。

农夫有两种移动方式:

从 X 移动到 X−1或 X+1,每次移动花费一分钟

从 X 移动到 2∗X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。

农夫最少要花多少时间才能抓住牛?

输入格式

共一行,包含两个整数N和K。

输出格式

输出一个整数,表示抓到牛所花费的最少时间。

数据范围

0≤N,K≤10^5

输入样例:

cpp 复制代码
5 17

输出样例:

cpp 复制代码
4

代码:

cpp 复制代码
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, k;
int q[N];
int dist[N];

int bfs()
{
    memset(dist, -1, sizeof dist);
    dist[n] = 0;
    q[0] = n;
    
    int hh = 0, tt = 0;
    while(hh <= tt)
    {
        int t = q[hh ++];
        
        if(t == k) return dist[t];
        
        if(t + 1 < N && dist[t + 1] == -1)
        {
            dist[t + 1] = dist[t] + 1;
            q[++ tt] = t + 1;
        }
        
        if(t - 1 >= 0 && dist[t - 1] == -1)
        {
            dist[t - 1] = dist[t] + 1;
            q[++ tt] = t - 1;
        }
        
        if(t * 2 < N && dist[t * 2] == -1)
        {
            dist[t * 2] = dist[t] + 1;
            q[++ tt] = t * 2;
        }
    }
    
    return -1;
}

int main()
{
    cin >> n >> k;
    
    printf("%d\n", bfs());
    
    return 0;
}

1、q[]记录跳的点,dist[]记录距离

2、初始化距离,并且最开始的点为n,点n的距离为0

3、判断三种情况,这里顺序随便,因为最终取结果的时候,只会取最先到达的结果

相关推荐
q***518933 分钟前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
程小k36 分钟前
迷你编译器
c++·编辑器
Ghost-Silver1 小时前
《星火》——关于Deepseek的进化速度
笔记·算法
止观止1 小时前
实战演练:用现代 C++ 重构一个“老项目”
c++·实战·raii·代码重构·现代c++
代码游侠4 小时前
日历的各种C语言实现方法
c语言·开发语言·学习·算法
草莓熊Lotso4 小时前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
咔咔咔的6 小时前
1930. 长度为 3 的不同回文子序列
c++
春日见8 小时前
丝滑快速拓展随机树 S-RRT(Smoothly RRT)算法核心原理与完整流程
人工智能·算法·机器学习·路径规划算法·s-rrt
Code小翊8 小时前
”回调“高级
算法·青少年编程
云里雾里!8 小时前
力扣 977. 有序数组的平方:双指针法的优雅解法
算法·leetcode·职场和发展