题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2717
题解:一维简单BFS,详细看代码,0ms。
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=100002;
bool v[maxn];
int n,k;
struct nd{
int x,step;
};
bool check(int x){
if(x<0||x>100000||v[x])return false;
else return true;
}
int bfs(int s){
for(int i=0;i<=100000;i++)v[i]=false;//初始化标记
queue<nd>Q;
nd S;
S.x=s,S.step=0;
v[s]=1;
Q.push(S);
while(!Q.empty()){
nd now=Q.front();Q.pop();
if(now.x==k)return now.step;
if(check(now.x+1)){
nd tmp;tmp.x=now.x+1,tmp.step=now.step+1;
v[tmp.x]=1;
Q.push(tmp);
}
if(check(now.x-1)){
nd tmp;tmp.x=now.x-1,tmp.step=now.step+1;
v[tmp.x]=1;
Q.push(tmp);
}
if(check(now.x*2)){
nd tmp;tmp.x=now.x*2,tmp.step=now.step+1;
v[tmp.x]=1;
Q.push(tmp);
}
}
return -1;
}
int main(){
while(~scanf("%d%d",&n,&k)){
if(n>=k){printf("%d\n",n-k);continue;}//剪枝
int ans=bfs(n);
printf("%d\n",ans);
}
return 0;
}