有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
递归过程分解
-
基本情况:
- 当只剩下一个盘子时,直接将其从源针移动到目标针。这是递归的终止条件。
-
递归情况:
- 将 N 个盘子从源针移动到目标针,借助辅助针:
- 步骤 1:先将上面的 N−1个盘子从源针移动到辅助针。这可以看作是一个子问题,问题规模从 N 变为 N−1
- 步骤 2:将最大的盘子(第 N 个盘子)从源针移动到目标针。
- 步骤 3:最后,将之前在辅助针上的 N−1 个盘子移动到目标针。再次,这也是一个子问题
- 将 N 个盘子从源针移动到目标针,借助辅助针:
#include <iostream>
using namespace std;
// 把 src 针的最上面一个盘子移动到 dest 针上
void move(char src, char dest) {
cout << src << " --> " << dest << endl; // 输出移动的过程
}
// 把 n 个盘子从 src 针移动到 dest 针,以 medium 针作为中介
void hanoi(int n, char src, char medium, char dest)
{
// 基础情况:如果只有一个盘子,直接移动
if (n == 1)
{
move(src, dest); // 移动盘子从 src 到 dest
} else
{
// 递归
// 1. 将 n-1 个盘子从 src 移动到 medium,借助 dest
hanoi(n - 1, src, dest, medium);
// 2. 将第 n 个盘子(最大的盘子)从 src 移动到 dest
move(src, dest);
// 3. 将 n-1 个盘子从 medium 移动到 dest,借助 src
hanoi(n - 1, medium, src, dest);
}
}
int main() {
int N; // 盘子的数量
cout << "Enter the number of disks: ";
cin >> N; // 输入盘子的数量
hanoi(N, 'A', 'B', 'C'); // 从 A 针移动到 C 针,借助 B 针
return 0;
}