1. 程式人生 > >加一乘二平方

加一乘二平方

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; }