深度优先搜索的三种模板

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;
}
相关推荐
叠层归一研究院1 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡2 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴2 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
江畔柳前堤2 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
Navigator_Z2 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode
zander2583 小时前
LeetCode 739:每日温度——为什么单调栈要持续弹出
开发语言·python·算法
2601_955759883 小时前
如何降低 Claude API 批量生产返工率
大数据·人工智能·算法
rannn_1113 小时前
【力扣hot100】链表专题下|138、148、23、146
java·算法·leetcode·链表·开发
ly76893 小时前
分布式一致性算法详解:从 2PC、3PC 到 Paxos、Raft、ZAB
分布式·算法
阿维的博客日记3 小时前
保姆级教程-BBPE分词算法
算法·bbpe