每日算法打卡:递归实现排列型枚举 day 2

news2024/10/6 8:40:20

文章目录

    • 原题链接
    • 题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例:
        • 输出样例:
    • 题目分析
    • 示例代码

原题链接

94. 递归实现排列型枚举

题目难度:简单

题目描述

1 ∼ n 1 \sim n 1n n n n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 n n n

输出格式

按照从小到大的顺序输出所有方案,每行 1 1 1 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1 ≤ n ≤ 9 1 \le n \le 9 1n9

输入样例:
3 
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1 

题目分析

这道题的意思很简单,就是生成从 1 ∼ n 1 \sim n 1n的全排列,第二个要求就是要按照字典序从小到大输出,字典序就是对于两个序列或者字符串,从头开始比较,只要相同就向后移动,不同的话就是谁小谁的字典序就小,如果都相同就是字典序相同,规定短的序列字典序较小

我们看到数据范围是到 9 9 9的,因此我们可以大致判断出这个题的时间复杂度限制在 O ( n ∗ n ! ) O(n*n!) O(nn!)即可

我们在枚举全排列时有两种方式

第一种是依次枚举每个数放到不同的位置,即固定选择一个数,按照不同位置分类

第二种是依次枚举每个位置放不同的数,即固定选择一个位置,按照不同的数分类

对于本质上的算法其实是一样的,对于具体理解其实是不太相同的

为了便于画图,我们采取第二种方式,画出递归搜素树

屏幕截图 2024-01-02 114116.png

我们就可以通过这样一个过程,依次枚举每个位置,将不同的数字放入其中,直到我们枚举到最后一个位置,将答案输出即可

我们也需要记录每个位置的状态,可以采用数组或者数位来记录,这里我们同样采用数组的方式,除此之外,我们需要记录哪些数字被用过,因此我们需要一个布尔数组来记录

示例代码

#include<iostream>
using namespace std;

const int N = 10; // 数据范围,为了方便理解,我们直接取从1到n,因此需要开十个空间

int n;
int state[N]; // 记录状态的数组,每个位置上填入已经选中的数字
bool used[N]; // 记录是否被使用过,未被使用则为false,使用过则为true

void dfs(int cur) // cur表示当前枚举到第cur位
{
    // 首先判断何时递归完成
    if (cur > n)// 这里表示我们已经把最后一个位置的数据枚举完成了
    {
        for (int i = 1; i <= n; i++) // 输出结果
            cout << state[i] << ' ';
        cout << '\n';
        return;
    }

    // 枚举每个数字,填入state数组
    for (int i = 1; i <= n; i++)
    {
        if (used[i] == false) // 如果未被使用
        {
            state[cur] = i; // 填入数字i
            used[i] = true; // 表示该数字被使用过了
            dfs(cur + 1); // 递归到下一个位置进行处理

            // 恢复未使用时的状态
            state[cur] = 0;
            used[i] = false;
        }
    }
}

int main()
{
    cin >> n;
    dfs(1); // 表示从第一个位置开始枚举
    return 0;
}

感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CISSP 第1章:实现安全治理的原则和策略

作者&#xff1a;nothinghappend 链接&#xff1a;https://zhuanlan.zhihu.com/p/669881930 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 CIA CIA 三性&#xff1a; 机密性&#xff1a;和数据泄露有关。完整性…

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址&#xff0c;在 SRO_EX 目录下&…

开源数据可视化分析工具DataEase本地部署并实现远程访问

目录 前言 1. 安装DataEase 2. 本地访问测试 3. 安装 cpolar内网穿透软件 4. 配置DataEase公网访问地址 5. 公网远程访问Data Ease 6. 固定Data Ease公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊开源数据可视化分析工…

如何更好的进行API管理

相信无论是前端&#xff0c;还是后端的测试和开发人员&#xff0c;都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致&#xff0c;导致协作低效、频繁出问题&#xff0c;开发测试人员痛苦不堪。 API管理的难点在哪&#xff1f; 开发人员在 …

深度学习——PIL和OpenCV

PIL 官方文档 格式互转 opencv cv2.imread() 参数&#xff1a; filepath&#xff1a;读入imge的完整路径 flags&#xff1a;标志位&#xff0c;{cv2.IMREAD_COLOR&#xff0c;cv2.IMREAD_GRAYSCALE&#xff0c;cv2.IMREAD_UNCHANGED} cv2.IMREAD_COLOR&#xff1a;默认参数&…

【华为机试】2023年真题B卷(python)-计算礼品发放的最小分组数目

一、题目 题目描述&#xff1a; 又到了一年的末尾&#xff0c;项目组让小明负责新年晚会的小礼品发放工作。 为使得参加晚会的同时所获得的小礼品价值相对平衡&#xff0c;需要把小礼品根据价格进行分组&#xff0c;但每组最多只能包括两件小礼品&#xff0c;并且每个分组的价格…

Python入门第09篇(conda虚拟环境)

前言 一开始默认安装了最新的Python3.12&#xff0c;搞的倒也顺手&#xff0c;看别人会有不兼容的问题&#xff0c;在我这开始没出现。不过坑总会踩到的&#xff0c;这不就出问题了。pip install一个包一直不行&#xff0c;问了下度娘&#xff0c;说由于这个包使用了一些新技术…

007、控制流

先看下本篇学习内容&#xff1a; 通过条件来执行 或 重复执行某些代码 是大部分编程语言的基础组成部分。在Rust中用来控制程序执行流的结构主要就是 if表达式 与 循环表达式。 1. if表达式 if表达式允许我们根据条件执行不同的代码分支。我们提供一个条件&#xff0c;并且做出…

JavaWeb小项目练习(基于三层架构实现登录,对表增,删,改,查的操作)

一 创建项目并修改项目结构 File->New->Project新建一个名为javaweb01的工程 1 2 javaweb01->New->Module新建一个名为MyManage的模块 1 2 将MyManage模块设置为支持web项目 1 2 将web项目重命名并移动到main路径下 配置pom文件(文件依赖,打包方式,以及支持加载…

24年上半年想考软考,小白如何备考?

软考科目的考试时间&#xff1a; 软考考试时间&#xff1a; 软考高级有三科&#xff08;机考&#xff09;&#xff1a;《综合知识》、《案例分析》、《论文》 软考中级、初级&#xff08;机考&#xff09;&#xff1a; 《基础知识》、《应用技术》 考试报名官网&#xff1a;中…

SpringBoot集成 Websocket 实现服务与客户端进行消息发送和接收

介绍 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 效果 客户端效果 服务端日志 pom依赖 <!-- websocket --> <dependency><groupId>org.…

【Matlab】LSTM长短期记忆神经网络时序预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88688439 一&#xff0c;概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;结构&#xff0c;由于其对于…

1207. 大臣的旅费(dfs求树的直径/图论)

题目&#xff1a; 1207. 大臣的旅费 - AcWing题库 思路&#xff1a; dfs求树的直径。 代码&#xff1a; #include<iostream> #include<cstdio> #include<vector> using namespace std; const int N100100; struct Edge//边的id以及长度 {int id,w; };ve…

Mysql 下载与安装教程(详细介绍与总结)

一&#xff1a;版本介绍 首先&#xff0c;我们需要先进入官网进行下载&#xff0c;在官网中有好几个版本&#xff0c;那么这里我分别简述一下MySQL各个版本区别&#xff1a; 1&#xff1a;企业版&#xff0c;MySQL Enterprise Edition 需要付费的&#xff0c;可以免费试用30天…

redis的搭建及应用(五)-布隆过滤器插件

redis布隆过滤器 可以把布隆过滤器理解为bitmap结构&#xff0c;判断某个对象是否存在时&#xff0c;它可能会误判。但是布隆过滤器也不是特别不精确&#xff0c;只要参数设置得合理&#xff0c;它的精确度也可以控制得相对足够精确&#xff0c;只会有小小的误判概率。 总得来说…

从 0 到 1 实现 ReentrantLock

虽然本文的标题是从 0 到 1 实现 ReentrantLock &#xff0c;但是为了方便理解&#xff0c;我们先从一个问题出发&#xff1a;既然系统已经有 synchronized 关键字了&#xff0c;那么为什么还会出现 ReentrantLock 这种代码层面的锁? 这就要先回顾一下历史了&#xff1a;在 J…

微服务整合:构建高效灵活的分布式系统

随着软件开发的不断演进和业务的复杂性增加&#xff0c;微服务架构已经成为一种流行的解决方案。然而&#xff0c;当涉及到多个微服务之间的整合时&#xff0c;我们需要谨慎考虑如何实现高效、灵活的分布式系统。 微服务架构的流行使得软件开发变得更加灵活和可扩展。然而&…

layuiadmin新建tabs标签页,点击保存,打开新的标签页并刷新

用的layuiamin前端框架 需求&#xff1a;新增的页面为一个标签页&#xff0c;保存后&#xff0c;需要刷新列表 1、新建customMethod.js文件&#xff0c;自定义自己的方法 layui.define(function (exports) {var $ layui.$var customMethod {// 表单点击保存后&#xff0c;…

【ROS2】MOMO的鱼香ROS2(四)ROS2入门篇——ROS2节点通信之话题与服务

ROS2节点通信之话题与服务点 引言1 理解从通信开始1.1 TCP&#xff08;传输控制协议&#xff09;1.2 UDP&#xff08;用户数据报协议&#xff09;1.3 基于共享内存的IPC方式 2 ROS2话题2.1 ROS2话题指令2.2 话题之RCLPY实现2.2.1 编写发布者2.2 2 编写订阅者2.2.3 运行测试 3 R…