本文主要是介绍<题海拾贝>[递归]1.汉诺塔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链接
面试题 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());}
};
这篇关于<题海拾贝>[递归]1.汉诺塔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!