信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
上代码
#include<bits/stdc++.h>//广度优先搜索bfs,要使用队列。
using namespace std;
int h[1000001][3];
bool v[1000001];
int n,k;
int main(){
scanf("%d%d",&n,&k);
h[1][1]=n;v[n]=1;
int head=0,tail=1;
do{
head++;//head=1
for(int i=1;i<=3;i++){
int x=h[head][1];//因为h[head][1]=0,所以x=0
if(i==1)x++;//i=1,x=x+1,右移一位
if(i==2)x--;//i=2,x=x-1,左移一位
if(i==3)x*=2;//i=3,x=2*x,移动到2*x
if((x>=0)&&(x<=100000))//判断是否越界
if(!v[x] || h[x][2]>h[h[head][1]][2]+1)//h[head][1]=1-->h[1][2]+1
{ //是否走过!v[x]或者是否步数最少
tail++;//tail+1,尾指针+1
h[tail][1]=x;//新搜索到的点x,入队
v[x]=1;//记录走过的点
h[x][2]=h[h[head][1]][2]+1;//h[x][2]记录步数
}
}
}while(head<tail);
printf("%d",h[k][2]);
return 0;
}