算法--生成1~n的排列

2023-11-16

在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为:

(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。

从中我们似乎发现了一些规律:先输出以1开头的排列,再输出以2开头的排列,然后是3;而在以1开头的排列中,1的后一位又是按从小到大的顺序出现,这似乎有些递归的联系。

事实上,我们分析一下生成排列的全过程,就会发现有一定递归的规律:

这不就是一棵树嘛?确实,由于这棵树能展现递归函数的调用过程,所以也称之为----解答树。

现在,根据解答树我们可以开始构造递归函数了:  定义一个大小等于待排列元素数目的数组,据解答树特点,可用DFS方式逐层深入给数组填空,然后由数组大小作为递归边界,并且在赋值时注意判断不可重复。

代码如下

#include<cstdio>
#include <cstdlib>
using namespace std;

void permutation(int *a,int n,int cur){
	if(cur==n){
		for(int i=0;i<n;i++)printf("%d ",a[i]);printf("\n");
	}
	else {
		for(int j=1;j<=n;j++){
			int ok=1;
			for(int k=0;k<cur;k++){			
				if(a[k]==j){
					ok=0;break;
				}
			}
			if(ok){
				a[cur]=j;
				permutation(a,n,cur+1);
			}			
		}
	}
}
int main(){
	int n;
	scanf("%d",&n);
	int *a=new int[n]; 
	permutation(a,n,0); 
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法--生成1~n的排列 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • C# 中附加/分离事件处理程序的不同方式有什么区别

    我的问题有两个部分 首先 我们可以通过以下两种方式附加事件处理程序 myObject MyEvent new EventHandler MyHandler myObject MyEvent MyHandler 据我了解 这两者是等价的 在第
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • Dynamics Crm:获取状态代码/状态代码映射的元数据

    在 Dynamics CRM 2011 中 在事件实体上 状态原因 选项集 也称为状态代码 与 状态 选项集 也称为状态代码 相关 例如看这个截图 当我使用 API 检索状态原因选项集时 如下所示 RetrieveAttributeRequ
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 使用Python,OpenCV进行图像哈希

    使用Python OpenCV进行图像哈希 1 效果图 2 原理 3 源代码 参考 这篇博客将介绍图像哈希 感知哈希以及这些算法如何用于 快速 确定图像的视觉内容是否相同或相似 并实现了差异散列 一个常见的感知散列算法 1 非常快 而 2
  • SSE 指令

    数据类型 m64 任意整型 m128 4 位 32 bit 浮点型 m128d 2 位 64 bit 浮点型 m128i 任意整型 数学运算 m128 mm add ss m128 a m128 b 单精度浮点 低位加法 result a0
  • [技术发展-20]:高级研修班-智能电网-能源互联网的关键技术

    作者主页 https blog csdn net HiWangWenBing 文章出处 https blog csdn net HiWangWenBing article details 118314590 目录 目录 第一章 能源互联网的
  • 深度学习笔记8:softmax层的实现

    如果有什么疑问或者发现什么错误 欢迎在评论区留言 有时间我会一一回复 softmax简介 Softmax回归模型是logistic回归模型在多分类问题上的推广 在多分类问题中 待分类的类别数量大于2 且类别之间互斥 比如我们的网络要完成的功
  • if ...if和if...elif区别

    我一直以为写if还是elif都是一样的 今天没事做了下试验 证明凡是存在的都是合理的 不会存在无谓的东西 通过运行下面的代码我可以看出 if elif的逻辑是 程序先走if 能走就走 走完就不走elif了 走不通的情况才走elif 比如当a
  • Flask(二):flask数据库操作+ORM封装+flask配置文件编写规则

    flask数据库操作 django中使用ORM连接操作数据库 python使用pymysql链接数操作数据库 flask中也可以使用pymysql链接 sqlalchemy python的开源的ORM框架 flask sqlalchemy
  • Linq 三表 left join 的实现

    目的实现 select id name jname cname from userinfo u left join job j on u job j jid left join city c on u city c cid 多表left j
  • 家长叫我别天天我在房间没事多看看新闻,我说我马上写个爬虫爬新闻看!!!

    文章目录 前言 撸起袖子开始看新闻 爬新闻 完整代码 爬取结果 看新闻喽 最后 前言 本文爬虫源码已由 GitHub https github com 2335119327 PythonSpider 已经收录 内涵更多本博文没有的爬虫 有兴
  • 使用webpack打包vue项目

    使用webpack打包vue项目 安装webpack工具 安装方式有两种 全局安装 命令 npm install g webpack webpack cli 以及安装在项目中 这里使用第二种 在项目中安装 这里的 D表示运用到开发 deve
  • Python中,如何初始化不同的变量类型为空值

    常见的数字 字符 很简单 不多解释 列表List的其值是 x y z 的形式 字典Dictionary的值是 x a y b z c 的形式 元组Tuple的值是 a b c 的形式 所以 这些数据类型的变量 初始化为空值分别是 数值 di
  • 影视剪辑,短视频从拍摄到剪辑,超详细教程

    Hello 在这个短视频时代很多小伙伴想拍摄短视频 却无从下手 给你们分享一下 新手拍短视频的技巧 希望能帮助你轻松入门 关于视频后期制作也分享8个技巧 一 闪白 在视频拍摄剪辑合成节目时 如果不直接使用白帧叠化 而是在原素材上调高gamm
  • 基于STM32的IAP技术分享

    基于STM32的IAP技术分享 1 烧录过程说明 2 厂家bootloader 3 bootloader区和APP区空间划分 4 bootloader区和APP程序内容说明 5 实验 5 1实验所用到的上位机软件 5 2 bootloade
  • 7.STM32IO引脚的复用和映射

    1 端口复用是什么 STM32有很多内置外设 这些外设的外部引脚都是可以与GPIO复用的 一个GPIO可以复用为外置内设的功能引脚 就是一个IO口可以作为很多的功能 可以根据情况选择功能 例如PA9 PA10 是作为串口使用的 而不是作为普
  • reactor模式 proator模式

    reactor模式 浅析 http www cnblogs com dolphin0520 p 3916526 html http blog csdn net xcwll sina article details 47783665 在事件驱
  • KVM中virtio-user工作思路(十二)

    主要查看一下virtio user的工作思路 个人觉得他主要是用来替换KNI或者OVS的TAP设备 更好的用法应该是给container来用 主要是通过操作 dev vhost net创建kernel的tap设备用 然后kernel和vir
  • 通用服务器系统,Engine

    Engine C 服务器编程底层库 特点 Windows Linux双平台 Windows下为静态库 主要方便开发者调试 Linux下为动态库 用于生产环境部署 基本包含集成服务器常用模块 数学 文件系统 配置 日志 网络 脚本 时间 多线
  • AI 人工智能之常见概率分布(1)

    二项分布 考察由n次随机试验组成的随机现象 它满足以下条件 1 重复进行n次随机试验 2 n次试验相互独立 3 每次试验仅有两个可能结果 4 每次试验成功的概率为p 失败的概率为1 p 在上述四个条件下 设X表示n次独立重复试验中成功出现的
  • PHP中常见的命令执行函数与代码执行函数

    部分参考 eval函数和system函数的区别 代码执行漏洞和命令执行漏洞 美豆阿的博客 CSDN博客 渗透测试之 PHP中常见的命令执行函数及其利用与防御 通地塔的博客 CSDN博客 php中代码执行 命令执行函数 卿先生 博客园 目录
  • CS109: Probability for Computer Scientists笔记1

    维生素C吃多了会上火 个人CSDN博文目录 CS109 Probability for Computer Scientists Summer 2022笔记合集
  • 算法--生成1~n的排列

    在暴力求解法中 我们常常要用上枚举一些简单内容以便方便获得解 若要输出整数n的前n个整数的全排列 则按字典序输出为 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 从中我们似乎发现了一些规律 先输出以1开头的排列 再