![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/87f3c910a93fba0ac6da58bb8f9034d3.png#pic_center)
题目大意:
- *行走:FJ可以在一分钟内从任意点X移动到点X - 1或X + 1
*传送:FJ可以在一分钟内从任意X点移动到2 * X点 - n,k范围在(0-1e5)之间,不在范围内不考虑
代码如下:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define mm(a,x) memset(a,x,sizeof a)
const int N = 1e5 + 10;
const int maxn = 1e5;
int n,k;
int dist[N];
int bfs(int x){
queue<int > q;
mm(dist,inf);
dist[x] = 0;
q.push(x);
while(q.size()){
int t = q.front();
q.pop();
if(t == k){
break;
}
int d[3] = {t - 1, t + 1, t * 2};
for(int i = 0; i < 3; i ++ ){
int p = d[i];
//不在范围内不要考虑,注意
if(p < 0 || p > maxn) continue;
if(dist[p] != inf) continue;
dist[p] = dist[t] + 1;
q.push(p);
}
}
return dist[k];
}
int main() {
cin >> n >> k;
//如果奶牛在后面,只有一个状态(往后走一步:x - 1)
if(n - k > 0) cout << n - k << endl;
//考虑这三种转移状态
else cout<<bfs(n)<<endl;
return 0;
}