题目描述
有三根柱子 A、B、C,初始时 A 柱上有 n 个大小不同的圆盘,从小到大叠放。目标是将所有盘子从 A 移动到 C,过程中大盘子不能压在小盘子上面。

解题思路
汉诺塔是理解递归思想的绝佳入口。面对 n 个盘子的问题,我们可以将其拆解为更小的子问题:
- 将 A 顶部的 n-1 个盘子借助 C 移动到 B;
- 将 A 剩余的最大盘子直接移到 C;
- 将 B 上的 n-1 个盘子借助 A 移到 C。
当 n=1 时,直接移动即可,这就是递归的终止条件。这种分治策略不仅逻辑清晰,也完美体现了递归'大事化小'的核心思想。
算法流程
设计递归函数 dfs(A, B, C, n),表示将 A 柱上的 n 个盘子通过辅助柱 B 移动到 C 柱。
- 基准情况:若 n=1,直接将 A 栈顶元素弹出并压入 C。
- 递归步骤:
dfs(A, C, B, n-1):将 n-1 个盘子从 A 移至 B(C 作为辅助);- 移动最大盘:
C.push_back(A.back()),A.pop_back(); dfs(B, A, C, n-1):将 n-1 个盘子从 B 移至 C(A 作为辅助)。

C++ 实现
class Solution {
public:
void dfs(vector<int>& A, vector<int>& B, vector<int>& C, int n) {
if (n == 1) {
C.push_back(A.back());
A.pop_back();
;
}
(A, C, B, n - );
C.(A.());
A.();
(B, A, C, n - );
}
{
n = A.();
(A, B, C, n);
}
};


