1. 题目来源
链接:1100. 抓住那头牛
2. 题目解析
和 [bfs] 红红去小寨(bfs最短路+思维) 一样,是一个很经典的 bfs
最短路模型题。详细题解看上题即可。
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
// 做过,若只有 +、- 其中一种情况的话就可以使用倒推来解决了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 5;
int n, k;
int q[N * 2];
int dist[N * 2];
int bfs() {
int hh = 0, tt = 0;
q[0] = n;
memset(dist, -1, sizeof dist);
dist[n] = 0;
while (hh <= tt) {
int t = q[hh ++ ];
if (t == k) return dist[k];
// 三种转移方式
if (t + 1 < N * 2 && 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 * 2 && dist[t * 2] == -1) {
dist[t * 2] = dist[t] + 1;
q[ ++ tt ] = t * 2;
}
}
return -1;
}
int main() {
scanf("%d%d", &n, &k);
int res = bfs();
printf("%d\n", res);
return 0;
}