辣鸡de代码(三)汉诺塔

  • Post author:
  • Post category:其他


不得不说,比起预想的真是出奇的简单(⊙ˍ⊙),一个递推解决。

设目标柱为Z,盘子开始时全在X上,中间还有一根空的Y柱。当只有两个盘子时,要将小盘移到Y上,再将大盘移到Z上,再移动小盘到Z上。

以此类推,若有N个圆盘,就要先将上面N-1个先移到辅助柱(Y)上,将最下层盘子移到目标柱上,然后忽略已经移好的最大的盘子。此时辅助柱变为X,将上面N-2个盘子移动到X上,再将最下面的大盘移到目标柱上。

第一次看感觉难的一批,但其实只有辅助柱为X/Y两种情况。

count = 0    # 计步器
def hanoi(n, x, y, z):
    global count                  # 全局变量
    if n == 1:
        count += 1
        print(x, '-->', z)         # x指盘子所在的柱子,不一定是X
    else:
        hanoi(n - 1, x, z, y)     # 上面n-1个盘子从X移到Y,Z为辅助柱
        count += 1
        print(x, '-->', z)         # x指盘子所在的柱子,不一定是X
        hanoi(n - 1, y, x, z)     # 最大的盘子移到Z后,将Y上的盘子移到Z上
hanoi(int(input('输入汉诺塔层数:')), 'X', 'Y', 'Z')
print('总步数为:', count)

也可去掉计数器,移动次数为2^(层数)-1。



版权声明:本文为qq_50998958原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。