递归方法解“4柱汉诺塔移动次数”问题

思路: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值