项目场景:
提示:这里简述项目相关背景:
练习题
问题描述:
提示:这里描述项目中遇到的问题:
有三个圆柱 A、B、C,初始时 A 上有 N 个圆盘,N 由用户输入给出,最终移动到圆柱 C 上。
每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP 是步骤序号,宽度为 4 个字符,右对齐。
请编写代码,获得输入 N 后,输出汉诺塔移动的步骤。
原因分析:
提示:这里填写问题的分析:
显而易见这道题必用递归,先不管有多少个圆盘,先把最后一个圆盘和N-1个圆盘看成两部分,这就相当于只有两个圆盘,只要完成两个圆盘的移动就可以了,现在可以不管第N个圆盘,假设A圆柱上只有N-1个圆盘,和前一步一样的步骤,前N-2个要先完成移动,就这样可以一步一步直接移动圆盘,N-2,N-3…1,最终最上方的盘子是可以直接移动到C柱
2号盘借助中间的柱子也能完成向c柱的转移,这时c柱上时已经转移成功的2个盘,于是3号盘也可以了,一直到第64号盘
解决方案:
提示:这里填写该问题的具体解决方案:
count = 1 # 设置全局变量 方便记录步骤数
def hanoi(num, src, mid, dst): # A B C
global count # 全局变量声明
if (num == 0):
return
# src源柱子
# dst目的柱子
# mid中间柱子,用于过度的
hanoi(num - 1, src, dst, mid) # 这里是移动除了最底部的圆盘
print("[STEP{:>4}] {}->{}".format(count, src, dst)) # 将源柱子上移动到目的柱子上
count += 1
# 将中间柱子上的圆盘移动到目的柱子上
hanoi(num - 1, mid, src, dst)
n = int(input())
hanoi(n, 'A', 'B', 'C')