汉诺塔问题

题目:

假设有3个柱子和一组不同大小的圆盘,柱子从圆盘的中心穿过。开始时,所有圆盘叠放在左侧第一个柱子上,目标是将所有的圆盘从第一个柱子移动到第三个柱子,同时遵守以下规则:

  1. 除了被移动时,所有圆盘都必须放在柱子上。
  2. 一次只能移动一个圆盘。
  3. 圆盘不能放置在比它小的圆盘上面。

递归解法:

递归地将 n-1 个圆盘从第一个柱子移动到第二个柱子,而使用第三个柱子作为临时挂钩,那么最大的圆盘将独自放在第一个柱子上。然后就可以一次性把最大圆盘从第一个柱子移动到第三个柱子。接下来,可以(递归地)将 n-1 个圆盘从第二个柱子移动到第三个柱子,这次使用第一个柱子作为临时柱子。

    void moveDisks(int n, string source, string dest, string temp)
    {
        if (n > 0)
        {
            //将n-1圆盘从源柱子移动到临时柱子
            //使用目标柱子作为临时柱子
            moveDisks(n - 1, source, temp, dest);
            //将圆盘从源柱子移动到目标柱子
            cout << "Move a disk from " << source << " to " << dest << endl;
            //将n-1圆盘从临时柱子移动到目标柱子
            //使用源柱子作为临时柱子
            moveDisks(n - 1, temp, dest, source);
        }
    }

参考链接

http://c.biancheng.net/view/1556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值