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

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

农夫有两种移动方式:

  • 从 $X$ 移动到 $X−1$ 或 $X+1$,每次移动花费一分钟
  • 从 $X$ 移动到 $2∗X$,每次移动花费一分钟
    假设牛没有意识到农夫的行动,站在原地不动。

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

输入格式
共一行,包含两个整数 $N$ 和 $K$。

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

数据范围
$0≤N,K≤105$
输入样例:

5 17

输出样例:

4

题解

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 2e5+10;
int g[N];
int dist[N];
int n,k;

int bfs() {
    memset(dist, -1, sizeof dist);
    dist[n] = 0;
    queue<int> que;
    que.push(n);
    dist[n] = 0;
    while(!que.empty()) {
        auto cur = que.front(); que.pop();
        if(cur == k) return dist[k];
        if(cur+1 < N && dist[cur+1] == -1) {
            dist[cur+1] = dist[cur] + 1;
            que.push(cur+1);
        }
        if(cur-1 >= 0 && dist[cur-1] == -1) {
             dist[cur-1] = dist[cur] + 1;
             que.push(cur-1);
        }
        if(cur * 2 < N && dist[cur * 2] == -1) {
            dist[cur * 2] = dist[cur] + 1;
            que.push(cur * 2);
        }
    }
    return -1;
}

int main() {
    cin >> n >> k;
    cout << bfs() << endl;
    return 0;
}
Last modification:April 16, 2024
如果觉得我的文章对你有用,请随意赞赏