一道bfs题,可以通过搜索+1、-1、*2这三种情况来判断,bfs是广度搜索,当第一次n==k时,就是最小的步骤,可直接输出;
这里用c++的队列来写比较方便,无奈弱暂时不会,就手动写了一个数组模拟队列的进出= =
下面贴上代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 200010
int n,k;
int b[N],que[N],step[N];
int bfs()
{
int head,tail,i,h,t;
head=tail=1;//初始化队列;
que[tail]=n;//将n入队;
tail++;//入队后队列向后延长
b[n]=1;//标记队列中元素
step[n]=0;//记录步骤
h=n;
while(head<tail)
{
for(i=1;i<=3;i++)
{
if(i==1)//进行三种情况的搜索
t=h-1;
if(i==2)
t=h+1;
if(i==3)
t=h*2;
if(t>N||t<0)//一定要判断越界问题,因为少写了这个RE了N次= =
continue;
if(b[t]==0)//如果点t不在队列中
{
b[t]=1;
que[tail]=t;//入队
step[t]=step[h]+1;//步骤加1
tail++;
}
if(t==k)
return step[t];
}
head++;//将队首元素出队
h=que[head];
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(b,0,sizeof(b));
memset(step,0,sizeof(step));
memset(que,0,sizeof(que));
if(n>=k)//如果n比k大,只能通过-1这一步来实现
printf("%d\n",n-k);
else
printf("%d\n",bfs());
}
return 0;
}