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、判断三种情况,这里顺序随便,因为最终取结果的时候,只会取最先到达的结果

相关推荐
fpcc4 分钟前
并行编程实战——CUDA编程的pipelines
c++·cuda
Irissgwe6 分钟前
数据结构-排序
数据结构·算法·排序算法
小O的算法实验室11 分钟前
2025年IEEE TITS,基于动态聚类粒子群算法的无人机任务分配与路径规划
算法
Tairitsu_H15 分钟前
[LC优选算法#5] 分治:快排 | 颜色分类 | 排序数组 | 第K大元素
c++·算法·leetcode·排序算法·快速排序
青山木17 分钟前
Hot 100 --- 滑动窗口最大值
java·数据结构·算法·leetcode·动态规划
青山木18 分钟前
Hot 100 --- 除自身以外数组的乘积
java·数据结构·算法
Frank学习路上22 分钟前
【C++】面试:STL容器与算法
c++·算法·面试
凡人叶枫22 分钟前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客23 分钟前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
凡人叶枫23 分钟前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++