思路:n盘3柱汉诺塔的移动次数问题,就是先将n-1个盘移动到过渡柱,再将底盘移动到目标柱,再将n-1个盘由过度柱移动到目标柱的问题,即f(n-1)+1+f(n-1)。
n盘4柱汉诺塔的移动次数问题,是先以4柱将任意i个盘移动到过渡柱(3柱都可以移,4柱当然更没问题),再将剩余的n-i个盘以其余3柱移动到目标柱( 即调用3柱问题的过程求得hnt3(n-i) ),最后将首次移动的i个盘(它们现在还在过渡柱上)移到目标柱,结束。即hnt4(i)+hnt(3-i)+hnt(i)次。
然后问题是前i个究竟是几可以随意取值,于是求得的移动次数不同,我们要其中的最小值。
算法:分别写出3柱和4柱的递归函数,其中4柱的用for循环求出所有不同i的取值并插入一个set集合中自动排序,最终首元素即为所求。
#include<iostream>
#include<set>
using namespace std;
int hnt3(int n) { //解3柱汉诺塔问题
if (n == 0)return 0; //三行if为递归基,稍加思考画画图即可得。
if (n == 1)return 1;
if (3 >= n + 1)return 2 * n - 1;
return 2 * hnt3(n - 1) + 1;
}
int hnt4(int n) { //解4柱汉诺塔问题
if (n == 0)return 0;
if (n == 1)return 1;
if (4 >= n + 1)return 2 * n - 1;
set<int> s;
for (int i = 0; i < n; i++) {
s.insert(2 * hnt4(i) + hnt3(n - i));
}
return *s.begin();
}
int main() { //测试代码
int n = 12;
cout << hnt4(n) << endl;
}