题目:
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; (3) 盘子只能叠在比它大的盘子上。
示例:
输入:A = [2, 1, 0], B = [], C = []
输出:C = [2, 1, 0]
解题思路:
柱子A上的盘子总数为n
1.当n=1时,直接将盘子从A移动到C
2.当n=2时,先将第一个盘子移动到B上,再将第二个盘子移动到C上,最后将B上的盘子移动到C上
3.当有n个盘子时
先将A上的n-1个盘子利用C移动到B上
再将第n个盘子移动到C上
最后将B上的n-1个盘子利用A移动到C上
所以实际就是将本题分解成规模较小的子问题来解决(递归的实质)。
源代码如下:
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
int n=A.size();//保存盘子的总数
//把n个盘子通过空柱子B移动到柱子C上
move(n,A,B,C);
}
void move(int n,vector<int>& A,vector<int>& B, vector<int>& C)
{
//如果盘子数量为1,那么直接将柱子A上的盘子移动到柱子C上
if(n==1)
{
C.push_back(A.back());
A.pop_back();
return;
}
//将柱子A上的n-1个盘子看成一个整体,利用空柱子C移动到柱子B上
move(n-1,A,C,B);
//再将柱子A的第n个盘子移动到柱子C上
C.push_back(A.back());
A.pop_back();
//最后将柱子B上的n-1个盘子,利用空主子A移动到柱子C上
move(n-1,B,A,C);
}
};