洛谷P1706全排列问题题解(两种方法+详解)

news2024/11/18 14:32:08

问题引出

全排列问题

题目描述

按照字典序输出自然数 1 1 1 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n n n

输出格式

1 ∼ n 1 \sim n 1n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 5 5 个场宽。

样例 #1

样例输入 #1

3

样例输出 #1

1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

提示

1 ≤ n ≤ 9 1 \leq n \leq 9 1n9

方法一:DFS深度优先搜索+剪枝

我们以N=3为例,构造一棵搜索树(或说是状态树)来进行搜索。
同时构造出三个格子,用来存放搜索树中的结果。
现在,我们从第一格开始搜索。第一格填1的搜索树如下:

所以N=3的情况下,第一格填1的排列情况共有两种123,132.
第一格填2的搜索树如下:

所以N=3的情况下,第一格填2的排列情况共有两种 213,231
如果你看懂了,请你自己画画第一格填3的搜索树
我们总结一下在上一部分中的思路在程序中如何实现:

先定义两个数组,一个是用来存放解的,一个是用来标记该数是否用过。
我们可以先写一个用于打印的函数print(),每当深搜时找到一个符合条件的解时,则print()一下,输出这个解(注意题目输出要求)。
接下来就是写深搜的函数了。主要思路:先判断格子是否填满了,如果填满,则print()一下。
如果没有填满,则开始循环,在循环中先判断当前填的数是否用过,如果没有,则填入,搜索下一格。

程序实现如下:

#include <iostream>
#include <iomanip>
using namespace std;
int pd[11]={0};//pd数组用于记录某个数字是否被使用过
int used[11];//used数组用于记录一个序列,如1,3,2或者3,1,2等等
int n;
//提前定义一个print函数方便待会进行输出
void print()
{
    for (int i = 1; i <= n; i++)
    {
        cout<<setw(5)<<used[i];
    }
    cout<<endl;
}
//定义深度优先函数进行遍历搜索
void dfs(int k)
{
    if(k==n)
    {
        print();
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (!pd[i])//如果当前数没有用过
        {
            pd[i]=1;//标记一下
            used[k+1]=i;//把这个数填入数组
            dfs(k+1);//填下一个
            pd[i]=0;//回溯
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
}

为了方便理解,我画出了第一格填1和第一格填2时函数的运行过程图:
在这里插入图片描述

方法二:利用 C + + < a l g o r i t h m > C++ <algorithm> C++<algorithm>库自带函数

C + + a l g o r i t h m C++ algorithm C++algorithm库当中里有一个函数,全排列函数:
next_permutation!
我管他叫字典排函数;
这个函数每运行一次就可以把数组排成下一个字典排数列;与之对应的是prev_permutation,即排出上一个字典序; a l g o r i t h m algorithm algorithm里有好多实用的函数,建议大家百度一下;
回到题上,我们怎样求出所有的组合呢?这是个组合排列问题,形如下图:

那么现在我们做的就是从n个数种拿n个数排列;也就是有n!种排列;理论完毕,代码如下:

#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int n,num=1,a[12];
    cin>>n;
    for (int i = 1; i <= n; i++)
    {
        num*=i;
        a[i]=n-i+1;//为了使用next_permutation函数,我们得倒着放
    }
    for (int i = 1; i <= num; i++)
    {
        next_permutation(a+1,a+n+1);
        for (int i = 1; i <= n; i++)
        {
            cout<<setw(5)<<a[i];
        }
        cout<<endl;
    }
}

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

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

相关文章

成为Jmeter大师:从入门到精通的环境搭建教程

一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xff1a;静态文件&#xff0c;Java Servlet,CGI Scripts,Java Object,数据库和FTP服…

什么是 http 代理,为什么需要 http 代理?

前言&#xff1a; 在我们进行软件测试工作的时候&#xff0c;会有很多地方需要去设置代理的。 比如&#xff1a;fiddler抓包&#xff0c;jmeter录制脚本等等。 甚至于&#xff0c;在某些公司&#xff0c;去访问某些内部网址的时候&#xff0c;都需要通过连接vpn才能成功访问。…

Meaning of life :Do not wait too long and miss the opportunity

生命的意义在于机会在眼前&#xff0c;我们就要去抓住他&#xff0c;错过了可能会遗憾终身&#xff0c;不要去等待机会的到来&#xff0c;很多时候真是应一句老话, "机不可失时不再来!" 。 Dont wait too long and miss the opportunity Each spring brings a blos…

瑞吉外卖 - 修改菜品功能(18)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

Flink第四章:水位线和窗口

系列文章目录 Flink第一章:环境搭建 Flink第二章:基本操作. Flink第三章:基本操作(二) Flink第四章:水位线和窗口 文章目录 系列文章目录前言一、水位线二、窗口二、实际案例1.自定义聚合函数2.全窗口函数3.水位线窗口4.统计用户点击数据5.处理迟到数据 总结 前言 这次博客记…

ChatGPT、GPT4、AutoGPT 和 MemoryGPT:初学者指南

人工智能 (AI) 不仅在改变行业&#xff0c;也在改变我们的日常生活。借助人工智能&#xff0c;我们可以改善我们的组织和生产力&#xff0c;让我们能够专注于真正重要的事情。在本文中&#xff0c;我们将探讨一些适用于日常生活的 AI 工具&#xff0c;以及它们如何帮助您保持井…

【Spring框架】--02.容器IoC、原理(手写IoC)

文章目录 3.容器&#xff1a;IoC3.1 IoC容器3.1.1 控制反转&#xff08;IoC&#xff09;3.1.2 依赖注入3.1.3 IoC容器在Spring的实现 3.2 基于XML管理Bean3.2.1搭建子模块spring6-ioc-xml3.2.2 获取bean①方式一&#xff1a;根据id获取②方式二&#xff1a;根据类型获取③方式三…

【Jmeter第三章】Jmeter给请求添加请求头

给请求加上请求头最常见的场景就是在请求头上添加token了&#xff0c;这里也拿添加token来举例 1、添加某个请求的请求头 1、选中HTTP请求&#xff0c;右键添加 2、添加请求头 2、添加公共的请求头信息 其实步骤和上面是一样的&#xff0c;只不过是选择&#xff1a;线程组…

极客的git常用命令手册

极客的git常用命令手册 1.1 权限配置篇1.1.1 创建ssh key1.1.2 本地存在多个密钥时&#xff0c;如何根据目标平台自动选择用于认证的密钥&#xff1f; 1.2 基础信息配置篇1.2.1 配置用户名1.2.2 配置用户邮箱1.2.3 设置文件名大小写区分1.2.4 设置命令行显示颜色1.2.5 检查git全…

MySQL高级_第11章_数据库的设计规范

MySQL高级_第11章_数据库的设计规范 1. 为什么需要数据库设计 2. 范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关…

如何用postman进行http接口测试?好好看好好学

目录 优点&#xff1a; 1、什么是POSTMAN 2、新建一个项目 2、新增一个用例 3、添加请求信息 4、post请求参数 5、添加头信息 6、预处理和结果检查 7、全局变量与环境变量 8、导出用例为代码 9、批量执行用例 HTTP的接口测试工具有很多&#xff0c;可以进行http请求…

打死都千万不要进外包...

我18年毕业于一个普通二本学校&#xff0c;是一个很不出名的小本科。大学期间专业知识也没有去认真的学习&#xff0c;所以毕业的时候就随便找了一份工作&#xff0c;在一个小公司做功能测试。 记得那时候薪资大概是6k左右&#xff0c;因为是在工厂&#xff0c;工作环境很差&a…

终极猜想 |欧科云链研究院揭秘货币未来形态

前言 5月18日&#xff0c;澎湃科技联合欧科云链研究院重磅发布的《从Web3“去美元化”看货币未来形态的终极猜想》文章&#xff0c;通过分析Web3.0“去美元化”的两大路径&#xff0c;对货币未来形态进行了前沿性的猜想。其中&#xff0c;Web3行业盛会Consensus2023&#xff0…

补充点【机器学习部分】

0518机器学习 身高和体重为特征&#xff0c;和标签训练阔以得到一个式子。 1.有监督学习&#xff1a; 2.训练集和测试集 3.模型学习 4.模型评估 5.基本术语 数据集&#xff1a;记录数据的集合 样本&#xff1a;每条记录关于一个事件或者对象的描述 特征&#xff1a;反映对…

软件安全-课后练习-格式化字符串-fmtstr2-随笔

一、准备工作 题目-百度网盘 1. 2.代码审计 只要输入不是yes或者no&#xff0c;就会调用到存在格式化字符串漏洞的printf函数 如果authenticated 的值为1195526213&#xff08;十六进制&#xff1a;0x47424845&#xff09;&#xff0c;就可以得到flag。 二、思路&#xf…

10. Redis哨兵(sentinel)

10. Redis哨兵sentinel 是什么&#xff1f;能干嘛怎么玩&#xff08;实战演示&#xff1a;&#xff09;Redis Sentinel架构&#xff0c;前提说明案例步骤&#xff0c;不服就干重点参数项说明其他 本次案例哨兵sentinel文件通用配置sentinel26379.confsentinel26380.confsentin…

Java并发常见面试题

Java并发常见面试题总结 1、什么是线程和进程&#xff1f; 何为进程&#xff1f; 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行程序&#xff0c;是一个进程从创建、运行到消亡的过程。 在Java中&#xff0c;当我们…

Java 的八大基本类型及其包装类型(超级详细)

Java 中有八种内置的基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char 和 boolean&#xff0c;其中&#xff0c;byte、short、int 和 long 都是用来表示整数&#xff0c;float 和 double 是用来表示浮点数的&#xff0c;那它们之间有什么区别和…

【C++】哈希/散列详细解析

前言&#xff1a;上篇文章介绍了unordered_set和unordered_map序列关联式容器&#xff0c;它们之所以效率比较高&#xff0c;是因为其底层使用了哈希结构。&#xff0c;所以这篇文章我们就来详细讲解一下哈希表。有关unordered序列关联式容器的知识&#xff0c;请移步至这篇文章…

单片机--USART

目录 【2】USART 【3】串口通信协议 【4】相关寄存器 串口控制寄存器 波特率寄存器 中断和状态寄存器 ​编辑 数据发送寄存器 数据接收寄存器 【5】 USART功能框图 【6】串口发送实验 实验要求 1.观察实物 2.分析原理图 3.STM32CubeMX配置 7、不定长接收 8、重定向 【1】…