使用回溯法枚举所有走楼梯的走法C++实现
使用回溯法枚举所有走楼梯的走法可以通过递归实现。以下是用 C++ 实现的代码示例,枚举所有可能的走法并打印出来:
代码实现
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> result; // 存储所有路径
vector<int> path; // 当前路径
void backtrack(int current, int n) {
// 如果当前台阶等于目标台阶,记录路径
if (current == n) {
result.push_back(path);
return;
}
// 如果当前台阶超过目标台阶,返回
if (current > n) {
return;
}
// 选择走 1 步
path.push_back(current + 1);
backtrack(current + 1, n);
path.pop_back(); // 回溯
// 选择走 2 步(如果可能)
if (current + 2 <= n) {
path.push_back(current + 2);
backtrack(current + 2, n);
path.pop_back(); // 回溯
}
}
int main() {
int n;
cout << "请输入台阶数 n: ";
cin >> n;
backtrack(0, n);
// 打印所有路径
cout << "所有走法路径:" << endl;
for (const auto& p : result) {
for (size_t i = 0; i < p.size(); ++i) {
cout << p[i];
if (i != p.size() - 1) {
cout << " -> ";
}
}
cout << endl;
}
cout << "总共有 " << result.size() << " 种走法。" << endl;
return 0;
}
代码说明
-
回溯函数
backtrack:current表示当前所在的台阶。n是目标台阶数。- 每次可以选择走 1 步或 2 步(如果可能)。
- 每次选择后,将当前路径记录到
path中,并递归调用backtrack。 - 使用
pop_back回溯,撤销当前选择。
-
主函数:
- 输入台阶数
n。 - 调用
backtrack从第 0 台阶开始。 - 打印所有路径和总走法数。
- 输入台阶数
示例运行
假设输入 n = 3,程序输出如下:
请输入台阶数 n: 3
所有走法路径:
1 -> 2 -> 3
1 -> 3
总共有 2 种走法。
复杂度分析
- 时间复杂度:(O(2^n)),因为每一步有两种选择(走 1 步或 2 步),递归树的高度为 (n)。
- 空间复杂度:(O(n)),递归调用栈的深度为 (n)。
这种方法适合较小的 (n),因为时间复杂度较高。如果 (n) 较大(如 (n > 30)),建议使用动态规划优化。

浙公网安备 33010602011771号