双色汉诺塔 2021-09-29

双色汉诺塔

n个圆盘,分成大小不同的n/2对,每对圆盘除颜色外完全相同。初始,这些圆盘按照从小到大的次序从上到下放在A柱上,最终要把橘色全部移到B柱,把蓝色全部移到C柱,移动的规则与Hanoi塔相同。

1. 设计一个移动的算法并给出伪码描述;

2. 计算你的算法所需要的移动次数;

3. 编程实现该算法。

请添加图片描述

  1. 算法设计思想:分治策略
    ,每次操作把情况变成如下图所示的情况,重复n/2次这样的操作,即可把橘色全部移动到B柱,蓝色全部移动到C柱。
    每次具体操作过程是,先把A柱上的n-1个圆盘移动到B柱,再把A上的最后一个蓝色盘子移动到 C 柱,最后把B柱上的n-2个圆盘移动到A柱(把最后一个圆盘留在了B柱)
    请添加图片描述伪码如下:
colorHanoi(n,A,B,C)
{
  while (n>0)
  {
    hanoi(n-1, A,B,C) //hanoi函数就是普通的汉诺塔函数
    move(A, B)
    hanoi(n-2,C,B,A)
    n-=2
   }

2.易知普通hanoi塔的移动次数是t(n)=2n-1-1,设n个盘子的移动次数是T(n),则
T(n)=n/2*(t(n-1)+1+t(n-2))。

   解得 T(n) = n*(2n-3 + 2n-4 - 2-1).
  1. Python代码实现
def hanoi(n, A, B, C): # 普通汉诺塔函数
    if n==1:
        print(A, "---->", C)
    else:
        hanoi(n-1, A, C, B)
        print(A, "---->", C)
        hanoi(n-1, B, A, C)
        
def colorhanoi(n): #双色汉诺塔
    i=n
    while i>0:
        hanoi(i-1,A,B,C)
        print(A, "---->", B)
        hanoi(i-2,C,B,A)
        i-=2

        
# 调用函数
n = input("请输入一共有几个盘子")
colorhanoi(n)

更多算法请关注公众号 算法成长指南
请添加图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值