#YHM12002. 汉诺塔问题

汉诺塔问题

题目:汉诺塔问题

题目描述

汉诺塔是一个经典的数学问题。有三根柱子,分别标记为 ABC。初始时,有 n 个大小不同的圆盘按照从大到小的顺序堆叠在柱子 A 上,最大的圆盘在最下面,最小的圆盘在最上面。现在需要将这 n 个圆盘从柱子 A 移动到柱子 C 上,移动过程需要遵循以下规则:

  1. 每次只能移动一个圆盘。
  2. 任何时候,都不能将较大的圆盘放在较小的圆盘上面。

请编写一个程序,输出将 n 个圆盘从柱子 A 移动到柱子 C 的具体步骤。

输入格式

一个整数 n1 <= n <= 10),表示圆盘的数量。

输出格式

输出若干行,每行表示一次圆盘的移动,格式为 Move disk [圆盘编号] from [起始柱子] to [目标柱子]。其中,[圆盘编号] 是从 1 到 n 的整数,代表圆盘的大小,1 表示最小的圆盘,n 表示最大的圆盘;[起始柱子][目标柱子] 分别是 ABC 中的一个,表示圆盘移动的起始位置和目标位置。

示例

  • 输入
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 的问题,可以分解为以下三个子问题:

  1. n - 1 个圆盘从柱子 A 借助柱子 C 移动到柱子 B
  2. 将第 n 个圆盘从柱子 A 移动到柱子 C
  3. n - 1 个圆盘从柱子 B 借助柱子 A 移动到柱子 C

通过不断地递归调用,直到只剩下一个圆盘时,直接将其从起始柱子移动到目标柱子即可。