返回首页 C++ 模板

DFS搜索模板

深度优先搜索——一条路走到底再回溯

DFS 深度优先 回溯 搜索 GESP6
#include <bits/stdc++.h>
using namespace std;

const int N = 25;
bool vis[N];
vector<int> path;

// 全排列 DFS
void dfs_perm(int n, int depth) {
    if (depth == n) {
        for (int x : path) cout << x << " ";
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (vis[i]) continue;
        vis[i] = true;
        path.push_back(i);
        dfs_perm(n, depth + 1);
        path.pop_back();   // 回溯
        vis[i] = false;
    }
}

// 组合 DFS:从 n 个中选 k 个
void dfs_comb(int n, int k, int start) {
    if (path.size() == k) {
        for (int x : path) cout << x << " ";
        cout << endl;
        return;
    }
    for (int i = start; i <= n; i++) {
        path.push_back(i);
        dfs_comb(n, k, i + 1);
        path.pop_back();
    }
}

int main() {
    dfs_perm(3, 0);     // 1~3 的全排列
    dfs_comb(4, 2, 1);  // C(4,2) 组合
    return 0;
}

📖 要点说明

⚠️ 常见错误