深度优先搜索的三种模板

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;
}
相关推荐
YLCHUP2 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀3 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落4 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi4 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂5 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的6 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
小雉系统15 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨12319 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏19 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口