加一乘二平方
阿新 • • 發佈:2019-01-29
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;
}