农夫知道一头牛的位置,想要抓住它。
农夫和牛都位于数轴上,农夫起始位于点 $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;
}