题目:
Description
给定整数i的f变换和g变换分别为f(i)=3*i;g(i)=└ i/2 ┘;└ ┘表示向下取整。现在给定n,m,即通过f和g变换把n变为m,求所需变换最小的次数。
Input
包含多个例子,每个例子一行,为n和m,即将n通过f和g变换变为m,两者以空格隔开。输入以0 0作为结束
Output
对每个例子输出一行,为最小的变换次数。
Sample Input
15 4
0 0
Sample Output
4
Hint
回溯
Source
#include <iostream>
using namespace std;
bool SearchWay(int Dept, const int n,const int m);
int k = 1;
int main(int argc, char* argv[])
{
int inData,outData,Dept = 1;
while(true)
{
scanf("%d%d",&inData,&outData);
if(inData == 0 && outData == 0)
break;
k = 1;
while(!SearchWay(1,inData,outData))
{
k++;
}
cout << k<< endl;
}
return 0;
}
int ChangeFun(const int n,const int m,int C)
{
if(C == 0)
return 3 * n;
else
return n / 2;
}
bool SearchWay(int Dept, const int n,const int m)
{
int num;
if(Dept > k) return false;
num = n;
for(int i = 0; i < 2; i++)
{
num = ChangeFun(n,m,i);
if(num == m || SearchWay(Dept + 1,num,m))
return true;
}
return false;
}
参考资料:http://hi.baidu.com/%CA%C9%BB%EA%B9%E9%C0%B4/blog/item/33a6d2dc27c7253e11df9bc0.html
太多重复计算。