题意是这样子的,给定两个整数n和k,通过 n+1或n-1 或n*2 这3种操作,使得n==k,输出最少的操作次数。
值得注意的是,这题要剪枝,不然会超时。
代码如下
#include<stdio.h>
#include<string.h>
#define MAX 100001
struct Point
{
int x;
}queue[100001];
int temp;
int step[MAX];
int visitd[MAX];
int bfs(int a,int b)
{
int front=-1,rear=0,next,i,ok=0;
memset(visitd,0,sizeof(visitd));
visitd[a]=1;
queue[0].x=a;
step[0]=0;
while(front<rear)
{
temp=queue[++front].x;
for(i=0;i<3;i++)
{
if(i==0)
next=temp-1;
else if(i==1)
next=temp+1;
else
next=temp*2;
if(next>MAX||next<0)
continue;
if(!visitd[next])
{
queue[++rear].x=next;
visitd[next]=1;
step[next]=step[temp]+1;
}
if(next==b)
return step[next];
}
}
}
void main()
{
int n,k;
scanf("%d%d",&n,&k);
if(n>=k)
{
printf("%d\n",n-k);
}
else
printf("%d\n",bfs(n,k));
}