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

今天整理一下写的三道dfs题目

选数

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

const int N = 21;
int n,m,cnt;
int a[N],b[N];


bool check(int x){
    if(x<2) return false;
    for(int i=2;i<=x/i;i++)//不建议写i*i<n
        if(x%i==0) return false;
    return true;
}

int dfs(int x,int start,int a[]){
    if(x>m){
        int sum=0;
        for(int i=1;i<=n;i++)sum+=b[i];
        if(check(sum))cnt++;
        return 0;
    }
    
    for(int i=start;i<=n;i++){
        b[x]=a[i];
        dfs(x+1,i+1,a);
        b[x]=0;
    }
    
    return cnt;
}


int main(){
    cin >> n >> m;
    for(int i=1;i<=n;i++) cin >> a[i];
    
    cout << dfs(1,1,a);
    
    return 0;
}

题解模拟过程

模拟开始:调用 main -> dfs(1, 1, a)
这里的 x=1 表示准备选第1个数,start=1 表示从数组 a 的第1个位置开始挑。

第一层递归 (x=1)
循环 i 从 1 到 4:

【步骤 1】 i = 1,选中 a[1] = 3。

b[1] = 3
进递归:dfs(2, 2, a) ------ 准备选第2个数,从第2个位置开始挑。
第二层递归 (x=2)
循环 i 从 2 到 4:

【步骤 2】 i = 2,选中 a[2] = 7。

b[2] = 7
进递归:dfs(3, 3, a) ------ 准备选第3个数,从第3个位置开始挑。
第三层递归 (x=3)
循环 i 从 3 到 4:

【步骤 3】 i = 3,选中 a[3] = 12。

b[3] = 12
进递归:dfs(4, 4, a) ------ 准备选第4个数。
第四层递归 (x=4)
判断:x (4) > m (3) 成立!到达终点。
计算和:sum = b[1] + b[2] + b[3] = 3 + 7 + 12 = 22。
检查素数:check(22)。22是偶数,返回 false。
cnt 不变,还是 0。
Return 0 (返回上一层)。
【回溯】 b[3] 变回 0。

【步骤 4】 i = 4,选中 a[4] = 19。

b[3] = 19
进递归:dfs(4, 5, a)。
第四层递归 (x=4)
判断:x (4) > m (3) 成立!
计算和:sum = 3 + 7 + 19 = 29。
检查素数:check(29)。29是素数,返回 true。
cnt++,现在 cnt = 1。
Return 0。
【回溯】 b[3] 变回 0。

循环结束,返回上一层。

【回溯】 b[2] 变回 0。

【步骤 5】 i = 3,选中 a[3] = 12。

b[2] = 12
进递归:dfs(3, 4, a) ------ 准备选第3个数,从第4个位置开始挑。
第三层递归 (x=3)
循环 i 从 4 到 4:

【步骤 6】 i = 4,选中 a[4] = 19。

b[3] = 19
进递归:dfs(4, 5, a)。
第四层递归 (x=4)
判断:x > m 成立。
计算和:sum = 3 + 12 + 19 = 34。
检查素数:34不是素数。
cnt 不变 (1)。
Return 0。
【回溯】 b[3] 变回 0。

循环结束,返回上一层。

【回溯】 b[2] 变回 0。

【步骤 7】 i = 4,选中 a[4] = 19。

b[2] = 19
进递归:dfs(3, 5, a)。
第三层递归 (x=3):循环 i 从 5 到 4,循环不执行,直接返回。
(这意味着:选了3和19之后,后面没数了,凑不齐3个数,这条路断了)。
循环结束,返回上一层。

【回溯】 b[1] 变回 0。

【步骤 8】 i = 2,选中 a[2] = 7。

b[1] = 7
进递归:dfs(2, 3, a)。
第二层递归 (x=2)
循环 i 从 3 到 4:

【步骤 9】 i = 3,选中 a[3] = 12。

b[2] = 12
进递归:dfs(3, 4, a)。
第三层递归 (x=3)
循环 i 从 4 到 4:

【步骤 10】 i = 4,选中 a[4] = 19。

b[3] = 19
进递归:dfs(4, 5, a)。
第四层递归 (x=4)
判断:x > m 成立。
计算和:sum = 7 + 12 + 19 = 38。
检查素数:38不是素数。
cnt 不变 (1)。
Return 0。

烧鸡

cpp 复制代码
//依次枚举每个调料可以放几g
#include <bits/stdc++.h>

using namespace std;

const int N = 20;

int n;
int a[N];//存临时方案
int res;//方案数
int b[59050][N];//存所有方案

//x表示当前枚举到了哪一位,sum表示当前已将选了的调料的总质量
void dfs(int x,int sum){
    if(sum>n)return;
    if(x>10){
        if(sum==n){
            res++;
            for(int i=1;i<=10;i++) b[res][i]=a[i];
        }
        return;
    }
    
    for(int i=1;i<=3;i++){
        a[x]=i;
        dfs(x+1,sum+i);
        a[x]=0;   
    }
}

int main(){
    
    cin >> n;
    dfs(1,0);
    cout << res << endl;
    
    for(int i=1;i<=res;i++){
        for(int j=1;j<=10;j++){
            cout << b[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

火星人

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

const int N = 10010;

int n,m;
int a[N];//存临时方案
int mars[N];//火星人的初始排列
int res;//记录方案数
bool st[N];//记录每个数有没有选过
bool flag;

void dfs(int x){
    if(flag)return;
    if(x>n){//前n个数已经选好了
       res++;
       if(res==m+1){
           flag=true;//找到了就不要再找了
           for(int i=1;i<=n;i++) cout << a[i] << " ";
       }
       return;
   }
   
    for(int i=1;i<=n;i++){
        if(!res) i=mars[x];//从火星人给的数开始枚举
        if(!st[i]){
            st[i]=true;
            a[x]=i;
            dfs(x+1);
            a[x]=0;
            st[i]=false;
        }
    }
    
}

int main(){
    
    cin >> n >> m;
    for(int i=1;i<=n;i++)cin >> mars[i];
    dfs(1);
    
    return 0;
}
相关推荐
汀、人工智能42 分钟前
[特殊字符] 第40课:二叉树最大深度
数据结构·算法·数据库架构·图论·bfs·二叉树最大深度
沉鱼.4443 分钟前
第十二届题目
java·前端·算法
大熊背2 小时前
ISP Pipeline中Lv实现方式探究之三--lv计算定点实现
数据结构·算法·自动曝光·lv·isppipeline
西岸行者2 小时前
BF信号是如何多路合一的
算法
大熊背3 小时前
ISP Pipeline中Lv实现方式探究之一
算法·自动白平衡·自动曝光
罗西的思考3 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(5)Context
人工智能·算法·机器学习
Liudef064 小时前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
OYpBNTQXi5 小时前
SEAL全同态加密CKKS方案入门详解
算法·机器学习·同态加密
蚂蚁数据AntData6 小时前
破解AI“机器味“困境:HeartBench评测实践详解
大数据·人工智能·算法·机器学习·语言模型·开源
ZC跨境爬虫6 小时前
Python异步IO详解:原理、应用场景与实战指南(高并发爬虫首选)
爬虫·python·算法·自动化