链接
面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)
函数头设计–重复子问题
假设是a,b,c三个柱子,a上面有n个盘子
所以函数头要三个数组,还要知道这次a柱上面的盘子数size
所以函数头如下
void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int size)
函数体设计–某个子问题
步骤:
- 把a的n-1个盘子借助c转移到b上
- 把a最底下的盘子转移到c盘子
- 把b的n-1个盘子借助a转移到c
dfs(A,C,B,size-1);
C.push_back(A.back());
A.pop_back();
dfs(B,A,C,size-1);
递归出口
a只剩最下面的盘子时,直接转移到c上面即可
代码实现
class Solution
{
public:
void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int size)
{
if(size==1)
{
C.push_back(A.back());
A.pop_back();
return;
}
dfs(A,C,B,size-1);
C.push_back(A.back());
A.pop_back();
dfs(B,A,C,size-1);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C)
{
dfs(A,B,C,A.size());
}
};