1541
加1乘2平方
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次
输入
输入两个10000以内的正整数m和n,且m小于n
输出
输出从m变化到n的最少次数
输入样例
1 16
输出样例
3
#include <stdio.h>
#include <stdlib.h>
int step[10001];
int queue[10001];
int m,n;
int head=0,tail=1,k=0;
int dfs(int n);
int moveto(int u,int i);
int notempty();
void addqueue(int v);
int getqueue();
int main()
{
int i,num;
scanf("%d%d",&m,&n);
queue[0]=m;
for(i=m;i<n;i++)
{
step[i]=-1;
}
step[m]=0;
num=dfs(n);
printf("%d\n",num);
return 0;
}
int dfs(int n)
{
int u,v,i;
while(notempty())
{
u=getqueue();
for(i=0;i<3;i++)
{ //i=0 jia1,i=1,cheng2,i=2,pingfang
v=moveto(u,i);
if(v==n)
return (step[u]+1);
if(v<=n&&step[v]==-1)
{
addqueue(v);
step[v]=step[u]+1;
}
}
}
return 0;
}
int moveto(int u,int i)
{
if(i==0)
u=u+1;
if(i==1)
u=u*2;
if(i==2)
u=u*u;
return u;
}
int notempty()
{
if(head==tail)
return 0;
return 1;
}
int getqueue()
{
int f;
f=queue[head];
head++;
return f;
}
void addqueue(int v)
{
queue[tail++]=v;
}