深度优先搜索的三种模板

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;
}
相关推荐
eBest数字化转型方案2 小时前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
residual_fan2 小时前
持续对比强化学习(Continual Contrastive Reinforcement Learning)论文分享
人工智能·算法·数据挖掘·数据分析
s_w.h3 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
信奥卷王3 小时前
2025年09月GESPC++五级真题解析(含视频)
算法
白狐_7983 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
闻缺陷则喜何志丹3 小时前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
leihefeng4 小时前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
全栈技术负责人4 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_34 小时前
面试题 02.07. 链表相交
算法·链表
residual_fan5 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析