题目:
有三根柱子,从左到右排列,编号分别是0、1、2。0号柱子上有n个盘子,从上到下,盘子依次增大,编号为1、2、3、···、n。现在需要将0号柱子上的盘子搬到右方编号为2的柱子上。有三条规则:
- 一次搬一只盘子。
- 每根柱子只有最上面的盘子可被搬动。
- 大盘子不可置于小盘子的上方。
思路:
要想把0号柱子最底下的n号盘子放到2号柱子上,需要先把1~n-1号盘子移到1号柱子上。再把n号盘子移动到2号柱子上。然后再把1~n-1号盘子从1号柱子移动到2号柱子上。工作结束。那怎么把1~n-1号盘子移动到1号柱子上呢?这个问题和题目的问题是一样的,只是问题规模变小了,可以使用递归处理。
代码:
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
int n = A.size();
hanotaRecursive(n, A,B,C);
}
void hanotaRecursive(int n, vector<int>& A, vector<int>& B, vector<int>& C) {
if (n == 1) {
C.emplace_back(A.back());
A.pop_back();
return;
}
hanotaRecursive(n - 1, A, C, B);
C.emplace_back(A.back());
A.pop_back();
hanotaRecursive(n - 1, B, A, C);
}
};