深度优先搜索的三种模板

1.指数型 DFS(子集型)

C++代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 20;

int n;
int st[N];  //表示当前位置的状态,0表示未考虑,1表示选,2表示不选

void dfs(int u){
    if(u > n){
        for(int i = 1; i <= n; i++){
            if(st[i] == 1) printf("%d ",i);   
        }
        puts("");
        return;   //结束当前的搜索
    }
    
    //第一个分支:选
    st[u] = 1;
    dfs(u + 1);
    st[u] = 0;
    
    //第二个分支:不选
    st[u] = 2;
    dfs(u + 1);
    st[u] = 0;
    
}
int main(){
    scanf("%d",&n);
    
    dfs(1);  //从第一个位置开始考虑
    
    return 0;
}

2.排列型DFS

C++代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 10;

int n;
int path[N];   //存每个方案
int st[N];     //标记每个数字的使用情况

void dfs(int u){
    if(u > n){
        for(int i = 1; i <= n; i++){
            printf("%d ",path[i]);
        }
        puts("");
        return;
    }
    
    for(int i = 1; i <= n; i++){
        
        if(st[i] == 0) {  //如果当前数字未使用过
            st[i] = true; //使用当前数字
            path[u] = i; 
            dfs(u + 1);
            
            st[i] = false;   //恢复现场
            path[u] = 0;
            
        }
    }
}
int main(){
    
    scanf("%d",&n);
    
    dfs(1);    //从第一个位置开始搜索
    
    return 0;
}

3.组合型DFS

C++代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 30;

int n,m;
int path[N];  //记录方案

void dfs(int u,int start){ //u表示当前搜索的位置,start 表示

    //剪枝!
    if(u + n - start < m) return;
    if(u > m){
        for(int i = 1; i <= m; i++){
            printf("%d ",path[i]);
        }
        puts("");
        return;
    }
    
    for(int i = start; i <= n; i ++){
        path[u] = i;
        dfs(u + 1, i + 1);  //当前选的数是i,因此下一个搜索从i + 1个位置开始
        
        path[u] = 0;   //恢复现场
    }
    
}
int main(){
    scanf("%d%d",&n,&m);
    
    dfs(1,1); 
    
    return 0;
}
相关推荐
vibecoding日记5 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21387 小时前
Verilog参数化游程编码RLE模块
算法
望易7 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络11 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
vivo互联网技术1 天前
ICLR 2026 | 基于后验采样的图像恢复方法LearnIR:人脸去阴影、去雾
人工智能·算法·aigc
浮生望1 天前
JS字符串与回文算法:从包装类到双指针的面试进阶之路
javascript·算法