当前位置: 首页 > news >正文

dfs(深度优先)——太抽象了

1.

两种方法

#include<bits/stdc++.h>
using namespace std;
//void dfs(int index,int n,vector<int> current)
//{
//	if(index>n){
//		for(int i=0;i<current.size();i++){
//			cout<<current[i]<<" ";
//		}
//		cout<<endl;
//		return;
//	}
//	dfs(index+1,n,current);不选当前数
//	current.push_back(index);选择当前数
//	dfs(index+1,n,current);
//}
//int main()
//{
//	int n;
//	cin>>n;
//	vector<int> current;
//	dfs(1,n,current);
//	return 0;
//}
const int N=15;
int n;
int s[N];
void dfs(int x){
    if(x>n){  // 递归终止条件
        for(int i=1;i<=n;i++){
            if(s[i]==1){  // 只输出被标记为1的数
                cout<<i<<" ";
            }
        }
        cout<<endl;
        return;
    }
    
    // 不选当前数x
    s[x]=2;
    dfs(x+1);
    s[x]=0;  // 恢复状态
    
    // 选当前数x
    s[x]=1;
    dfs(x+1);
    s[x]=0;  // 恢复状态
}
int main(){
	cin>>n;
	dfs(1);
}

2.全排列问题(输出1到n的所有排列)

#include<bits/stdc++.h>
using namespace std;
int n;            // 用户输入的n值
const int N=20;   // 最大支持n=20
int s[N];         // 存储当前排列的数组
bool used[N];     // 标记数字是否已被使用的数组
void dfs(int u){
    if(u>n){  // 递归终止条件:已填完所有位置
        for(int i=1;i<=n;i++){
            cout<<s[i]<<" ";  // 输出当前排列
        }
        cout<<endl;
        return;
    }
    
    for(int i=1;i<=n;i++){  // 尝试所有可能的数字
        if(!used[i]){       // 如果数字i未被使用
            s[u] = i;       // 第u位放数字i
            used[i] = true;  // 标记为已使用
            dfs(u+1);       // 递归处理下一位
            used[i] = false; // 回溯:恢复状态
            s[u] = 0;        // 回溯:恢复状态(可省略)
        }
    }
}
int main(){
    cin>>n;
    dfs(1);  // 从第1位开始填数字
    return 0;
}

3.组合枚举(从1到n中选出m个数的所有组合)

#include<bits/stdc++.h>
using namespace std;
int n, m;        // n: 总数范围, m: 需要选择的数个数
const int N=20;  // 最大支持n=20
int st[N];       // 存储当前组合的数组
void dfs(int u, int start){
    if(u>m){  // 递归终止条件:已选够m个数
        for(int i=1;i<=m;i++){
            cout<<st[i]<<" ";  // 输出当前组合
        }
        cout<<endl;
        return;
    }
    
    for(int i=start;i<=n;i++){  // 从start开始选择,避免重复
        st[u] = i;              // 第u个位置选数字i
        dfs(u+1, i+1);          // 递归选下一个数,从i+1开始
        st[u] = 0;              // 回溯(可省略)
    }
}
int main(){
    cin>>n>>m;
    dfs(1, 1);  // 从第1个位置开始选,起始数字为1
    return 0;
}

相关文章:

  • 【新能源汽车实验室设备控制:PLC与单片机选型指南(深度解析+实战案例)】
  • AI数字人直播系统
  • java中的枚举类型和c,c++的有区别吗?c,c++的枚举,结构体,联合体,三种数据有什么区别和联系
  • 基于DrissionPage的TB商品信息采集与可视化分析
  • 《大语言模型》学习笔记(四)--Transformer 模型
  • 数据库 第一章 MySql基础(1)
  • Thales靶机渗透攻略
  • 蓝桥杯备考----> Apple Catching G(线性DP)
  • 01LinePlot
  • 【蓝桥杯速成】| 12.回溯排列N皇后
  • leetcode day30 134+135+860
  • 深挖增长内核:好产品驱动增长的全方位解析
  • 深度解析:TOML、XML、YAML及其他配置/数据格式对比
  • 用YoloV8训练一个图片检测的模型,我接下来要做哪些事
  • 《深入Linux内核架构》读书笔记--第三章 内存管理
  • 【含文档+PPT+源码】基于Python的全国景区数据分析以及可视化实现
  • 【例3.5】位数问题(信息学奥赛一本通-1313)
  • BertTokenizer.from_pretrained的讲解和使用
  • golang编写UT:applyFunc和applyMethod区别
  • Oracle数据库服务器地址变更与监听配置修改完整指南
  • 以军称已开始在加沙的新一轮大规模攻势
  • 泽连斯基已离开土耳其安卡拉
  • 外交部介绍对巴西、阿根廷、智利、秘鲁、乌拉圭等5国试行免签政策
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 明查| 新一代AI诊疗系统可3秒筛查13种癌症?没有证据
  • 男子不满和睦家医院手术效果还遇到了“冒牌医生”?院方回应