题目
求解经典汉诺塔问题(Hanoi Tower):有三个柱子 A、B、C,将 n 个盘子从 A 柱借助 B 柱移动到 C 柱,每次只能移动一个盘子且大盘不能压在小盘上方,使用递归打印出全部移动步骤。
输入格式:一行输入一个正整数 n,表示盘子总数。
输出格式:按步输出形如 A->C 的移动路径,每步占一行。
数据范围与约定:1 ≤ n ≤ 10。
思路与算法
1. 经典分治递推三步法
要将 n 个盘从 from 移到 to(借助 aux):
① 递归将上面 n-1 个盘从 from 移到 aux;
② 直接将底部最大的第 n 号盘从 from 移到 to;
③ 递归将 n-1 个盘从 aux 移到 to。
2. 移动步数规律
n 个盘子的总移动步数精确为 2ⁿ - 1 步。当 n=1 时为递归基,直接输出移动并返回。
完整程序
#include <stdio.h>
// 经典汉诺塔递归:
// from: 起始柱, to: 目标柱, aux: 辅助柱
static void hanoi(int n, char from, char to, char aux)
{
// 递归出口:只有 1 个圆盘时,直接一步移到目标柱
if (n == 1) {
printf("%c->%c\n", from, to);
return;
}
// 第一步:借助 to 柱,将上面 n-1 个盘子从 from 移到 aux
hanoi(n - 1, from, aux, to);
// 第二步:将最底下最大的盘子从 from 移到 to
printf("%c->%c\n", from, to);
// 第三步:借助 from 柱,将 aux 上的 n-1 个盘子移到 to
hanoi(n - 1, aux, to, from);
}
int main(void)
{
int n;
if (scanf("%d", &n) != 1 || n < 1 || n > 10) {
return 1;
}
hanoi(n, 'A', 'C', 'B');
return 0;
}运行示例
输入:
2输出:
A->B
A->C
B->C