1. 汉诺塔
题目描述: 有三根柱子 A、B、C,A 上有 n 个大小不同的圆盘,按从小到大叠放。要求将所有圆盘移动到 C 柱上,且每次只能移动一个盘子,大盘子不能放在小盘子上面。
算法原理(递归):
思路:
这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:
- 假设 n=1,只有一个盘子,直接把它从 A 移到 C;
- 如果 n=2,借助 B 柱,共需 3 步:
- 1 号盘子放到 B 上
- 2 号盘子放到 C 上
- 1 号盘子放到 C 上
- 如果 n>2,将 A 上面的 n-1 个盘子挪到 B 上,再将最大的盘子挪到 C 上,最后将 B 上的小盘子挪到 C 上。
则本题可以解释为:
- 对于规模为 n 的问题,将 A 柱上的 n 个盘子移动到 C 柱上。
- 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
- a. 将 A 柱上的上面 n-1 个盘子移动到 B 柱上。
- b. 将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到 C 柱上。
- 当问题的规模变为 n=1 时,即只有一个盘子时,可以直接将其从 A 柱移动到 C 柱。
算法流程:
递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)
- 返回值:无;
- 参数:三个柱子上的盘子,当前需要处理的盘子个数。
- 函数作用:将 A 中的上面 n 个盘子挪到 C 中。
递归函数流程:
- 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回;
- 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
- 将 A 中最上面的一个盘子挪到 C 中;
- 将 B 中上面 n-1 个盘子挪到 C 中。
解法代码(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();
return;
}
dfs(A, C, B, n - 1);
C.push_back(A.back());
A.pop_back();
(B, A, C, n - );
}
{
n = A.();
(A, B, C, n);
}
};


