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

C++ dfs搜索枚举(四十九)【第九篇】

今天我们接着来学习dfs(枚举)

1.枚举排列

在之前的搜索枚举中,我们并没有考虑选入物品的 排列顺序。但在一些题目中,会要求考虑给定数字或物品的排列,这种排列可以是在 
n 个中的所有符合要求的全排列,也可以是在 
n 中找到长度为 k 的排列。

如果使用我们之前的搜索枚举方法,我们发现难以用参数标记原数组中数字的选取情况,那么我们就需要一个全局的布尔数组,帮助我们标记哪些数字已经被选入了排列。另一方面,由于我们使用了这样的全局标记数组,那么必然在搜索时使用到 回溯 技巧,在这个分支的搜索结束后,将标记数组还原。

若要输出 n 个数字全排列,在 dfs 数组中需要的参数需要包含已经选入的数字,在选取当前位数字后进行搜索后,要注意进行回溯

int n;
int per[N];
bool vis[N];
void dfs (int dep) {
    if (dep == n) {
        for (int i = 0; i < n; i++) {
            cout << per[i] << " ";
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if(vis[i]) {
            continue;
        }
        vis[i] = true;
        per[dep] = i;
        dfs(dep + 1);
        vis[i] = false;
}

如果想要输出 n 个数字的 k 排列,我们可以在之前代码上进行一些较小的修改。当我们选取到 k 个数字时就应该停止继续搜索枚举的过程。

int n;
int per[N];
bool vis[N];
void dfs (int dep) {
    if (dep == k) {
        for (int i = 0; i < k; i++) {
            cout << per[i] << " ";
        }
        cout << endl;
        return;
    }
    
    for (int i = 1; i <= n; i++) {
        if(vis[i]) {
            continue;
        }
        vis[i] = true;
        per[dep] = i;
        dfs(dep + 1);
        vis[i] = false;
    }
}


http://www.kler.cn/a/231304.html

相关文章:

  • jvisualvm工具使用
  • 【项目初始化】
  • 计算机网络一点事(22)
  • 【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据
  • Maui学习笔记- SQLite简单使用案例02添加详情页
  • deepseek R1的确不错,特别是深度思考模式
  • 《电子芯片的夜晚》
  • Octave实现位置式PID算法
  • Unreal Engine 中的插值方法示例
  • Rust语言入门小结(第2篇)
  • 获取目标进程导入DLL模块地址的方法
  • golang通用后台管理项目——Go+Vue通用后台管理项目实战
  • 第二讲:数据结构 AcWing 826. 单链表
  • 微信小程序(三十八)滚动容器
  • 基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---自研CPMS注意力,效果优于CBAM ,助力自动驾驶(二)
  • Rust 初体验1
  • vector类的模拟实现
  • DevOps落地笔记-21|业务价值:软件发布的最终目的
  • 【LeetCode】每日一题 2024_2_4 Nim 游戏(找规律,博弈论)
  • 【C语言】位与移位操作符详解
  • Linux第43步_移植ST公司uboot的第4步_uboot测试
  • 分享一下 uniapp 打包安卓apk
  • 【React】如何使antd禁用状态的表单输入组件响应点击事件?
  • Spring GateWay
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件
  • 阿里云ECS服务器Linux安装Mysql8