加1乘2平方。
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次?
输入:输入两个10000以内的正整数m和n,且m小于n
输出: 输出从m变化到n的最少次数
#include<iostream>
#include<queue>
using namespace std;
queue<int>q1;
int step[100000];
int m,n;
int moveto(int num,int number);
void init();
int bfs();
int canmoveto(int num,int dire);
int main(void){
int sum;
cin>>m>>n;
init();
sum=bfs();
cout<<sum<<endl;
return 0;
}
void init(){
for(int i=0;i<100000;i++){
step[i]=-1;
}
q1.push(m);
step[m]=0;
}
int bfs(){
int num,sum;
while(!q1.empty()) {
num=q1.front();
q1.pop();
for(int i=0;i<3;i++){
if(canmoveto(num,i)){
sum=moveto(num,i);
if(sum==n){//已经达到目标数
return(step[num]+1);
}
if(step[sum]==-1){//节点没有到达过
step[sum]=step[num]+1;
q1.push(sum);
}
}
}
}
return (-1);
}
int canmoveto(int num,int number){
int sum;
if(number==0) sum=num+1;
if(number==1) sum=num*2;
if(number==2) sum=num*num;
if(sum<=n && step[sum]==-1) return (1);// 新生的节点小于等于目标并且没有到达过
else return(0);
}
int moveto(int num,int number){
int sum;
if(number==0) sum=num+1;
if(number==1) sum=num*2;
if(number==2) sum=num*num;
return sum;
}