由于两种移动方式移动都只花费相同时间,所以从起点开始bfs,枚举两种方式走法加到队列里即可。
注意移动范围并不在1e5内,例如牛在100000处,农夫在50001处,则最优解是
50001
⇒
100002
⇒
100001
⇒
100000
50001\Rightarrow 100002\Rightarrow100001\Rightarrow100000
50001⇒100002⇒100001⇒100000。
实际上范围在 [ 0 , 2 ∗ 1 0 5 ] [0, 2*10^5] [0,2∗105],因为当农夫在 k k k的右侧时,必然要往左走,不可能先往右再往左,而k最大是1e5,农夫至多在2e5的位置。
#include <iostream>
#include <algorithm>
using namespace std;
int n, k;
int q[200005];
int dis[200005];
int bfs(int n) {
int head = 0, tail = 0;
q[head] = n;
dis[n] = 1;
while(head <= tail) {
int t = q[head ++ ];
int d = dis[t];
if (t == k) {
return d - 1;
}
if (t - 1 >= 0 && !dis[t - 1]) {
q[ ++ tail] = t - 1;
dis[t - 1] = d + 1;
}
if (t + 1 <= 2 * k && !dis[t + 1]) {
q[ ++ tail] = t + 1;
dis[t + 1] = d + 1;
}
if (2 * t <= 2 * k) {
q[ ++ tail] = 2 * t;
dis[2 * t] = d + 1;
}
}
return -1;
}
int main() {
scanf("%d%d", &n, &k);
printf("%d\n", bfs(n));
return 0;
}