题意:农夫在n点,牛在k点,农夫每次可以移动到x-1、x+1、2*x点处,每次移动消耗一分钟,求农夫抓到牛消耗的最少时间
思路:简单BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int n, k, vis[maxn];
struct node{
int x, s;
node(int x = 0, int s = 0) : x(x), s(s) {}
};
int main()
{
while (cin >> n >> k) {
if (n >= k) {
cout << n-k << endl;
continue;
}
int res = 0;
queue<node> q;
memset(vis, 0, sizeof(vis));
q.push(node(n, 0));
vis[n] = 1;
while (!q.empty()) {
node t = q.front(); q.pop();
if (t.x == k) {
cout << t.s << endl;
break;
}
for (int i = 0; i < 3; i++) {
int x, s = t.s + 1;
if (i == 0) {
x = t.x - 1;
} else if (i == 1) {
x = t.x + 1;
} else {
x = 2 * t.x;
}
if (x >= 0 && x < maxn && !vis[x]) {
q.push(node(x, s));
vis[x] = 1;
}
}
}
}
return 0;
}