我正在构建一个函数来确定一个人爬到楼梯顶部的不同方式(可以爬1步或2步)。虽然我已经掌握了打印多少种方式的主要功能,但我对如何打印特定组合感到困惑,即有三种方法可以爬到顶端:(1,1,1),(1,2),( 2,1)。
#include <iostream>
using namespace std;
int climbStairs(int n);
int main()
{
int s = 4;
cout << "There are " << climbStairs(s) << " ways to climb to the top: ";
return 0;
}
int climbStairs(int n)
{
if(n == 0) return 0;
if(n == 1) return 1;
int one = 1;
int two = 0;
int result = 0;
for(int i = 1;i <= n;i++)
{
result = one + two;
two = one;
one = result;
}
return result;
}
关于如何打印组合的任何解释都会有所帮助,非常感谢你!
答案 0 :(得分:0)
不要将变量one
和two
作为整数,而是将它们定义为“路径”集。然后,做同样的事情,除了result
是one
时,其中的所有“路径”附加1加上two
,并且其中的所有“路径”都附加了2。
算法看起来像这样(我建议在查看我的代码之前尝试自己做):
#include <set>
#include <string>
#include <iostream>
std::set<std::string> climbStairs(int n)
{
if(n == 0)
return {""};
if(n == 1)
return {"1"};
std::set<std::string> one({"1"}), two({""}), result;
for(int i = 2; i <= n; i++)
{
result.clear();
for(const std::string &path : one)
{
result.insert(path + '1');
}
for(const std::string &path : two)
{
result.insert(path + '2');
}
two = move(one);
one = move(result);
}
return one;
}
int main()
{
std::set<std::string> s = climbStairs(5);
for(const std::string &path : s)
{
std::cout << path << '\n';
}
}
这是我所知道的最佳方式。