使用回溯法枚举所有走楼梯的走法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;
}

代码说明

  1. 回溯函数 backtrack

    • current 表示当前所在的台阶。
    • n 是目标台阶数。
    • 每次可以选择走 1 步或 2 步(如果可能)。
    • 每次选择后,将当前路径记录到 path 中,并递归调用 backtrack
    • 使用 pop_back 回溯,撤销当前选择。
  2. 主函数

    • 输入台阶数 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)),建议使用动态规划优化。

posted @ 2025-04-14 14:29  kkman2000  阅读(47)  评论(0)    收藏  举报