有三个圆柱A、B、C,初始时A上有N个圆盘,N由用户输入给出,最终移动到圆柱C上。
每次移动步骤的表达方式示例如下:[STEP 10] A->C。其中,STEP是步骤序号,宽度为4个字符,右对齐。
请编写代码,获得输入N后,输出汉诺塔移动的步骤。
输入格式:一个整数
输入示例1
4
输出格式:每个步骤一行,每行参考格式如下:[STEP 10] A->C
输出示例1
[STEP 1] A->C
[STEP 2] A->B
[STEP 3] C->B
[STEP 4] A->C
[STEP 5] B->A
[STEP 6] B->C
[STEP 7] A->C
steps = 0
def hanoi(src, des, mid, n):
global steps
if n == 1:
steps += 1
print("[STEP{:>4}] {}->{}".format(steps, src, des))
else:
hanoi(src, mid, des, n-1)
steps += 1
print("[STEP{:>4}] {}->{}".format(steps, src, des))
hanoi(mid, des, src, n-1)
N = int(input())
hanoi("A", "C", "B", N)
代码说明:
- 递归终止条件:当只有一个盘子时,直接从源柱子移动到目标柱子。
- 递归步骤:
- 将 n-1 个盘子从源柱子移动到中间柱子
- 将第 n 个盘子从源柱子移动到目标柱子
- 将 n-1 个盘子从中间柱子移动到目标柱子
- 步骤计数:使用全局变量
steps
记录移动次数,并按照要求格式输出。
这个算法的时间复杂度是 O (2ⁿ),因为每次递归调用都会产生两个子调用。