#YHM12002. 汉诺塔问题
汉诺塔问题
题目:汉诺塔问题
题目描述
汉诺塔是一个经典的数学问题。有三根柱子,分别标记为 A
、B
、C
。初始时,有 n
个大小不同的圆盘按照从大到小的顺序堆叠在柱子 A
上,最大的圆盘在最下面,最小的圆盘在最上面。现在需要将这 n
个圆盘从柱子 A
移动到柱子 C
上,移动过程需要遵循以下规则:
- 每次只能移动一个圆盘。
- 任何时候,都不能将较大的圆盘放在较小的圆盘上面。
请编写一个程序,输出将 n
个圆盘从柱子 A
移动到柱子 C
的具体步骤。
输入格式
一个整数 n
(1 <= n <= 10
),表示圆盘的数量。
输出格式
输出若干行,每行表示一次圆盘的移动,格式为 Move disk [圆盘编号] from [起始柱子] to [目标柱子]
。其中,[圆盘编号]
是从 1 到 n
的整数,代表圆盘的大小,1 表示最小的圆盘,n
表示最大的圆盘;[起始柱子]
和 [目标柱子]
分别是 A
、B
、C
中的一个,表示圆盘移动的起始位置和目标位置。
示例
- 输入:
3
- 输出:
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
提示
汉诺塔问题是一个典型的可以用递归方法解决的问题。递归的基本思想是将一个大问题分解为多个相似的小问题。对于将 n
个圆盘从柱子 A
移动到柱子 C
的问题,可以分解为以下三个子问题:
- 将
n - 1
个圆盘从柱子A
借助柱子C
移动到柱子B
。 - 将第
n
个圆盘从柱子A
移动到柱子C
。 - 将
n - 1
个圆盘从柱子B
借助柱子A
移动到柱子C
。
通过不断地递归调用,直到只剩下一个圆盘时,直接将其从起始柱子移动到目标柱子即可。