冲刺蓝桥杯-DFS板块(第一天)

DFS的三种枚举

指数型枚举
cpp 复制代码
//递归  DFS最重要的是顺序
//顺序:从1~n依次考虑每个数 选/不选
#include <bits/stdc++.h>

using namespace std;

const int N =20;
int n;
int st[N];//记录每个数的状态,0表示还没考虑,1表示选,2表示不选

void dfs(int x){//x表示枚举到了当前的那个位置
    if(x>n){
        for(int i=1;i<=n;i++){
            if(st[i]==1)
            cout << i << " ";
        }
        cout << endl;
        return;
    }
    
    //选
    st[x]=1;//上来先选
    dfs(x+1);//下一个数
    st[x]=0;//恢复现场
    //不选
    st[x]=2;//上来先不选
    dfs(x+1);//下一个数
    st[x]=0;//恢复现场
    
}

int main(){
    cin >> n;
    dfs(1);
    
    return 0;
}
排列型枚举
cpp 复制代码
//依次枚举每个位置应该放那个数
#include <bits/stdc++.h>

using namespace std;

const int N = 10;

bool st[N];//某个数是否被用过true表示选过false表示没有选过
int a[N];
int n;
//x表示当前枚举到了那个位置
void dfs(int x){
    if(x>n){
        for(int i=1;i<=n;i++){
            cout << a[i] << " ";
        }
        cout << endl;
        return;
    }
    
    for(int i=1;i<=n;i++){
        if(!st[i]){//如果没有被选过
            st[i]=true;
            a[x]=i;
            dfs(x+1);//判断下一个数
            a[x]=0;
            st[i]=false;
        }
    }
    
    
}

int main(){

    cin >> n;
    dfs(1);
    
    return 0;
}
组合型枚举
cpp 复制代码
//依次枚举每个位置上放那个数
#include <bits/stdc++.h>

using namespace std;

int n,m;
const int N  = 21;
int a[N];//记录都选了那些数

void dfs(int x,int start){//分别用来记录当前枚举到了那个位置,以及当前位置从几开始枚举
    
    if(x>m){
        for(int i=1;i<=m;i++) cout << a[i] << " ";
        cout << endl;
        return;
    }
    
    for(int i=start;i<=n;i++)
    {
        a[x]=i;
        dfs(x+1,i+1);
        a[x]=0;
        
    }
}


int main(){
    cin >> n >>m;
    
    dfs(1,1);
    
    return 0;
}

这个博主讲的十分细致值得深度了解学习,非常推荐,家人们!!!
【递推与递归 + DFS | 手把手带你画出递归搜索树】 https://www.bilibili.com/video/BV1S24y1p7iH/?share_source=copy_web&vd_source=214f528e7195022e9e1787511eda8c5a

相关推荐
aaaameliaaa1 小时前
指针之总结
c语言·笔记·算法
宵时待雨1 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz1 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp2 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238562 小时前
C/C++每日一练6
c语言·c++·算法
AI小码2 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby4 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao4 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
青山木8 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先