深度优先搜索的三种模板

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;
}
相关推荐
闪电悠米10 分钟前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
栋***t15 分钟前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
wabs66616 分钟前
关于图论【卡码网100.最大岛屿的面积的思考】
数据结构·算法·图论
CHANG_THE_WORLD23 分钟前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
geovindu2 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法
微露清风2 小时前
模拟算法学习记录
学习·算法
KaMeidebaby2 小时前
卡梅德生物技术快报 | abcore 纳米抗体文库:从PNAS论文看纳米抗体理性设计:构象熵作为亲和力预测新指标的技术实现
java·开发语言·人工智能·算法·机器学习
问商十三载3 小时前
2026法律行业AI引擎生成式优化怎么优化?三层专业加固提排名,零成本提33%引用率附适配表
java·前端·人工智能·算法
zander2583 小时前
138. 随机链表的复制
数据结构·算法·链表