递归思想之Hanoi塔问题

【题目】

​设 A,B,C 是三个塔座。开始时,在塔座 A 上有 n个圆盘,这些圆盘自下而上,由大到小地叠放``一起,各圆盘从小到大编号为1,2,...,n。现在要将 塔座 A 上的这一叠圆盘经由塔座 B 移动到塔座 C ,并仍按同样的顺序叠置,最少需要多少次?​

移动规则:

  1.  一次只能移动一个盘子;
  2.  大的盘子不能压在小盘子上;
  3. ​ 满足前面两项规则的前提下,可将盘子移至 A、B、C 中任一柱子上;

 【算法思想】

当n=1时,将圆盘直接移到C塔座上;

当n=2时,将小的圆盘移到B塔座上,将大的圆盘移到C塔座上;

当n>2是,将n个叠在一起的圆盘分成两组:

    [1]:最大的那个圆盘自己作为一个组;

    [2]:除去那个最大的圆盘,叠在最大的那个圆盘上面的n-1个圆盘可视为一个组。

通过分组,我们的问题将变得非常的容易解决啦!!!

第一步,借助辅助塔座B,我们将塔座A上面的n-1个圆盘(即第二个分组)移到塔座B 上(顺序依然同塔座A 一样)

第二步,将塔座A 上最大的那个圆盘移到塔座C上

第三步,将塔座B上的圆盘也分成两组(分组方法同上),借助辅助塔座A,将塔座B上面的n-1个圆盘移动到塔座A上,然后将塔座B上剩余的那个最大的圆盘移到塔座C上

不断重复上述操作,直至圆盘全部按顺序叠置到塔座C上。

【示例】

有三个塔座分别是A、B、C,塔座A上有3个圆盘,现要借助塔座B ,将塔座A上的3个圆盘移到塔座C上:

【C++代码实现】

#include<iostream>
using namespace std;
void Hanoi(int n, char A, char B, char C)
{
    if (n == 1)
    {
        printf("%c -> %c\n", A, C);
    }
    else
    {
        Hanoi(n - 1, A, C, B);
        printf("%c -> %c\n", A, C);
        Hanoi(n - 1, B, A, C);
    }
}
int main()
{
    Hanoi(3, 'A', 'B', 'C');
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值