抓住那头牛_BFS

1100. 抓住那头牛

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

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

农夫有两种移动方式:

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

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

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

输入格式

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

输出格式

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

数据范围

≤ ≤ 10 ^ 5

输入样例:

5 17

输出样例:

4

思路:

  DFS的话超时,找最短路径这类问题还得是BFS;

  具体思路见表:

  如样例  n = 5 k = 17:

i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
q[i] 5 6 10 4 7 12 11 20 9 8 3 14 13 24 22 19 18 16 2 15 28 26 23 21 17 32 1 30 27 25
dist[q[i]] 0 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <bits/stdc++.h>
using namespace std;
 
const int N = 100005;
 
int n, k;
int dist[2 * N];
int q[N];
 
int bfs(){
    memset(dist, -1, sizeof(dist));
    q[0] = n;
    dist[n] = 0;
    int hh = 0, tt = 0;
    while(hh <= tt){
        int t = q[hh++];
         
        if(t == k)  return dist[t];
         
        if(t + 1 <= k && dist[t + 1] == -1){
            q[++tt] = t + 1;
            dist[t + 1] = dist[t] + 1;
        }
        if(t * 2 <= 2 * k && dist[t * 2] == -1){
            q[++tt] = t * 2;
            dist[t * 2] = dist[t] + 1;
        }
        if(t - 1 >= 0 && dist[t - 1] == -1){
            q[++tt] = t - 1;
            dist[t - 1] = dist[t] + 1;
        }
    }
     
}
int main()
{
    cin >> n >> k;
     
    cout << bfs() << endl;
     
    return 0;
}

__EOF__

本文作者从荣
本文链接https://www.cnblogs.com/rongrongrong/p/15883016.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   荣荣荣荣荣荣  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示