1771整数变换问题(搜索+剪枝)

Description

整数变换问题。关于整数i的变换f和g定义如下:f(i)=3i;
试设计一个算法,对于给定的2 个整数n和m,用最少的f和g变换次数将n变换为m。例如,可以将整数15用4 次变换将它变换为整数4:4=gfgg(15)。当整数n不可能变换为整数m时,算法应如何处理?
对任意给定的整数n和m,计算将整数n变换为整数m所需要的最少变换次数。

Input

输入数据的第一行有2 个正整数n和m。n≤100000,m≤1000000000。

Output

将计算出的最少变换次数以及相应的变换序列输出。第一行是最少变换次数。第2 行是相应的变换序列。

Sample

Input 

15 4

Output 

4
gfgg

Hint

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int n, m, top;
 6 char re[105];
 7 
 8 int dfs(int cur, int step)
 9 {
10     if(step > top) return 0;
11     else
12     {
13         if(cur*3==m||dfs(cur*3, step+1))
14         {
15             re[step] = 'f';
16             return 1;
17         }
18         else if(cur/2==m||dfs(cur/2, step+1))
19         {
20             re[step] = 'g';
21             return 1;
22         }
23         return 0;
24     }
25 }
26 
27 int main()
28 {
29     int i;
30     cin >> n >> m;
31     top = 1;
32     while(!dfs(n, 1))
33     {
34         top++;
35     }
36     cout << top << endl;
37     for(i=top;i>=1;i--)
38     {
39         cout << re[i];
40     }
41     cout << endl;
42     return 0;
43 }
原文地址:https://www.cnblogs.com/0xiaoyu/p/14100626.html