本文设计专题一算法题链接
1 汉诺塔问题
题目描述

汉诺塔是递归思想的经典入门题。规则很简单:有三根柱子 A(起始)、B(辅助)、C(目标)。A 柱上有 n 个盘子,从小到大叠放。目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,且大盘子不能放在小盘子上面。
递归思想
解决这个问题的关键在于将规模为 n 的问题分解为规模更小的子问题。
基本情况
当 n = 1 时,直接将 A 最上面的盘子移到 C 即可终止。
递归分解 若要将 A 上的 n 个盘子移到 C,可以拆解为三步:
- 将 A 上除了最底下的盘子(即上面 n-1 个)移到 B(借助 C 作为辅助);
- 将 A 最底下的最大盘子移到 C;
- 将 B 上的 n-1 个盘子移到 C(借助 A 作为辅助)。
这样,大问题就被拆成了两个规模为 n-1 的子问题。
算法实现(C++)
class Solution {
public:
void hanota(vector<int>& a, vector<int>& b, vector<>& c) {
(a, b, c, a.());
}
:
{
(n == ) {
c.(a.());
a.();
;
}
(a, c, b, n - );
c.(a.());
a.();
(b, a, c, n - );
}
};





