从可行性出发容易想到BFS,但是每种状态下有3种情况拓展(i-1,i+1,2*i)
数目有点大,因此需要剪枝
1.每个数最大取到k+1才有意义
2.每个数出现一次即可,因此可以用一下hash技术a[]数组
#include<stdio.h>
int n,k;
struct note
{
int num;
int s;
}que[1000000];
int a[1000000];
void bfs(void)
{
int head=1,tail=1;
que[tail++].num=n;
while(head<tail)
{
int temp;
temp=que[head].num*2;
if(a[temp]==0&&temp<=k+1)
{
a[temp]++;
que[tail].num=temp;
que[tail].s=que[head].s+1;
if(que[tail].num==k)
break;
tail++;
}
temp=que[head].num-1;
if(a[temp]==0&&temp<=k+1)
{
a[temp]++;
que[tail].num=temp;
que[tail].s=que[head].s+1;
if(que[tail].num==k)
break;
tail++;
}
temp=que[head].num+1;
if(a[temp]==0&&temp<=k+1)
{
a[temp]++;
que[tail].num=temp;
que[tail].s=que[head].s+1;
if(que[tail].num==k)
break;
tail++;
}
head++;
}
printf("%d\n",que[tail].s);
return;
}
int main()
{
scanf("%d%d",&n,&k);
if(n>=k)
printf("%d\n",n-k);
else
bfs();
return 0;
}