算法--生成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的排列 的相关文章

  • MSI 和 EXE 安装程序有什么区别,我应该选择哪一个? [复制]

    这个问题在这里已经有答案了 可能的重复 msi 和 setup exe 文件之间有什么具体区别 https stackoverflow com questions 1789530 what are the specific differen
  • 如何从该 Voronoi 图数据中获取单元格字典?

    使用找到的voronoi delaunay图生成库在这个节目中 http sourceforge net projects mapmanager 这是基于 财富 最初的实施他的算法 http en wikipedia org wiki Fo
  • 删除字符串 C 的第一个字符

    我试图删除字符串的第一个字符并保留其余部分 我当前的代码无法编译 我对如何修复它感到困惑 My code char newStr char charBuffer int len strlen charBuffer int i 1 char
  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • 如何在 MFC 中调整对话框大小时移动控件?

    我已经在 MFC 中创建了对话框视图 从下图中可以清楚地看到 如滑块控件和编辑框等 当我调整对话框大小时 这些控件不会移动 在此输入图像描述 https i stack imgur com 7OxAK jpg 我想移动控件以适应对话框 但不
  • C++ 私有静态成员变量

    此 C 代码在编译时产生链接器错误 A h class A public static void f private static std vector
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 从窗口内容截取屏幕截图(无边框)

    我正在寻找有关如何使用 C 将表单内容保存在位图中的解决方案 我已经尝试过使用 DrawToBitmap 但它捕获了所有带边框的窗口 这就是这段代码的结果 public static Bitmap TakeDialogScreenshot
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • C# 的空条件委托调用线程安全吗? [复制]

    这个问题在这里已经有答案了 这就是我一直以来编写事件引发者的方式 例如属性更改 public event PropertyChangedEventHandler PropertyChanged private void RaisePrope
  • 需要使用 openssl 加密和解密文件的示例 C 代码

    我正在用 Linux C 编写代码 我需要使用以下命令来加密和解密文件 openssl 目前 我使用系统命令 des3 e nosalt k 0123456789012345 in inp file out out file 进行加密 使用
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码
  • 如何将 char 转换为 unsigned int?

    我有一个字符数组 它实际上用作字节数组 而不是用于存储文本 在数组中 有两个特定字节表示我需要存储到无符号 int 值中的数值 下面的代码解释了设置 char bytes bytes 2 bytes 0 0x0C For the sake

随机推荐

  • 使用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开头的排列 再