C++力扣 汉诺塔
class Solution {
public:
void hanota(vector<int>& a, vector<int>& b, vector<int>& c)
{
dfs(a,b,c,a.size());
}
void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n)
{
if(n==1)
{
c.push_back(a.back());
a.pop_back();
return;
}
dfs(a,c,b,n-1);
c.push_back(a.back());
a.pop_back();
dfs(b,a,c,n-1);
}
};
1.题目解释
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。
初始的盘子样子!!
2.算法原理
重点在why
为什么可以用递归??
大问题-》相同类型的子问题
小问题-》相同类型的子问题
3.如何编写递归代码?
依次循环~~~~~~~~
递归的出口
4.代码实现
class Solution {
public:
void hanota(vector<int>& a, vector<int>& b, vector<int>& c)
{
dfs(a,b,c,a.size());
}
void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n)
{
if(n==1)
{
c.push_back(a.back());
a.pop_back();
return;
}
dfs(a,c,b,n-1);
c.push_back(a.back());
a.pop_back();
dfs(b,a,c,n-1);
}
};