问
n个圆盘,分成大小不同的n/2对,每对圆盘除颜色外完全相同。初始,这些圆盘按照从小到大的次序从上到下放在A柱上,最终要把橘色全部移到B柱,把蓝色全部移到C柱,移动的规则与Hanoi塔相同。
1. 设计一个移动的算法并给出伪码描述;
2. 计算你的算法所需要的移动次数;
3. 编程实现该算法。
答
- 算法设计思想:分治策略
,每次操作把情况变成如下图所示的情况,重复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).
- 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)
更多算法请关注公众号 算法成长指南