题目:传送门
分析:超简单的bfs,稍微剪枝一下就好了,比如X-1要判断>=0,X+1要判断<=k,X*2要判断小于K*2。最后注意的就是N==K这种情况。
代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN=2e5+10;
int n,k;
struct Node{
int x,time;
Node(int _x,int _time):x(_x),time(_time){}
};
queue<Node> q;
bool vis[MAXN];
void bfs(){
if(n==k){
cout<<0<<endl;
return ;
}
while(!q.empty()) q.pop();
memset(vis,false,sizeof vis);
q.push(Node(n,0));
vis[n]=true;
while(!q.empty()){
Node cur=q.front();
q.pop();
int xx=cur.x+1;
if(xx==k){
cout<<cur.time+1<<endl;
return ;
}
if(xx<k&&!vis[xx]){
vis[xx]=true;
q.push(Node(xx,cur.time+1));
}
xx=cur.x-1;
if(xx==k){
cout<<cur.time+1<<endl;
return ;
}
if(xx>=0&&!vis[xx]){
vis[xx]=true;
q.push(Node(xx,cur.time+1));
}
xx=cur.x*2;
if(xx==k){
cout<<cur.time+1<<endl;
return ;
}
if(xx<k*2&&!vis[xx]){
vis[xx]=true;
q.push(Node(xx,cur.time+1));
}
}
}
int main(){
cin>>n>>k;
bfs();
return 0;
}