思路
首先这是个多柱汉诺塔问题,对于n阶汉诺塔,具体步骤如下:
1. 首先我们将x个盘子移到B柱,步数为step(x);
2. 然后将n-x个盘子移到C柱,步数为2^(n-x)-1;
3. 最后我们再将B柱上的x个盘子移到C柱,步数为step(x)。
4. 上面的x在1到n之间取值,对于每一个X,我们可以求出一个step(n),然后我们取其中的最小值作为最优解;
code
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 double step[65]; //为防止溢出,使用double 7 int main() { 8 step[1] = 1; 9 step[2] = 3; 10 for(int i = 3; i < 65; i ++) { 11 step[i] = 100000; 12 for(int j = 1; j < i; j ++) { 13 step[i] = min(step[i], (double)(2 * step[j] + pow(2, i - j) - 1)); 14 } 15 } 16 int n; 17 while(cin >> n) { 18 cout << step[n] << endl; 19 } 20 return 0; 21 }