栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

双色汉诺塔 2021-09-29

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

双色汉诺塔 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)

更多算法请关注公众号 算法成长指南

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/276307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号