组合数学-next_permutation全排列_next_permutation函数 水星人-程序员宅基地

技术标签: 算法  组合数学  

竞赛中关于排列问题可能会使用到next_permutation函数的一个全排列,但是仍然需要掌握基本的排列的递归写法,下面简单介绍一下用法。(直到如何使用即可)

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反

1.STL中的next_permutation 用法
2.全排列的递归写法

1.使用STL里面的函数进行全排列:(全排列前要需要排序才行)

数字排序:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    
	char a[] = {
    1,2,3};
	sort(a,a+3);
	do{
    
		for(int i = 0;i < 3;i++) printf("%d ",a[]);
		printf("\n");
	}while(next_permutation(a,a+3));
	return 0;
}

输出结果:

123
132
213
231
321
312

字符串全排列:

#include<stdio.h>
#include<algorithm>
using namespace std;
//int cmp(const void *a,const void *b){
    
//	return *(char *)a-*(char *)b;
//}
int main(){
    
	char a[] = "132";
	sort(a,a+3);//C++
//	qsort(a,3,sizeof(a[0]),cmp);//C 
	do{
    
		printf("%s\n",a);
	}while(next_permutation(a,a+3));
	return 0;
}

输出结果:

123
132
213
231
321
312


结构体的全排序
解释一下,结构体也可以通过写 cmp 函数实现全排列,

next_permutation(node,node+n,cmp)

也可以借助下标进行全排列

#include<stdio.h>
#include<algorithm>
using namespace std;
const int Maxn = 3;
struct Node{
    
	int x;
}a[100];
int q[100];
int main(){
    
	for(int i = 1;i <= Maxn;i++){
    
		a[i].x = q[i] = i;	//让结构体元素按照正常顺全排列 
//		a[Maxn-i+1] = q[i] = i;	//顺序将会相反 
	}
	do{
    
		for(int i = 1;i <= Maxn;i++) printf("%d ",a[q[i]].x);
		printf("\n");
	}while(next_permutation(q+1,q+Maxn+1));
	return 0;
}

这个是STL中的源码可以参考一下,它的是非递归写法,下面会说到递归写法。参考链接
在这里插入图片描述


2.全排列的递归写法

#include <iostream>
using namespace std;
void get_permutation(char *a, int idx, int length)	//左下标和长度值,从头循环到尾
{
    
    if (idx == length-1){
    
        for (int i=0; i<length; ++i)
            printf("%s ",a);
        printf("\n");
    }
    else {
    
        for (int i=idx; i<length; ++i){
    
            swap(a[i],a[idx]);
            get_permutation(a,idx+1,length);
            swap(a[i],a[idx]);
        }
    }
}
int main()
{
    
    char array[] = "123";
    get_permutation(array,0,3);
    return 0;
}

输出结果:

123
132
213
231
321
312

最后:
next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

另外,需要强调的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

简单用法就是上面局的例子,时间复杂度是在 O(n!) ~ O(n∗n!) 之间,还是比较花时间的,所以慎用(蓝桥杯中用法会比较多)
参考链接

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_53269459/article/details/121091366

智能推荐

php 编译 pdo_mysql_Linux正确编译pdo_mysql扩展-程序员宅基地

文章浏览阅读280次。错误编译pdo_mysqlphp扩展的操作流程,以及解决错误并成功完成编译pdo_mysql新编译的PHP环境运行项目时报错PHP Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'原因是没有加载pdo_mysql扩展错误配置pdo_mysql及编译cd ext/pdo_mysqlphpize./configure --w..._/usr/local/php7.4.24/ext/pdo_mysql/php_pdo_mysql_int.h:29:11: fatal error: m

Mybatis入参_mybatis select参数对象-程序员宅基地

文章浏览阅读332次。<!-- 关于sql语句中填充占位符时参数的处理: 1.单个参数:MyBatis不做任何处理,填充占位符时获取参数的key可以任意指定 如:#{任意指定} 2.多个参数:MyBatis会将多个参数封装到一个Map中,Map的key时arg0,arg1,arg2...或者param1,pa..._mybatis select参数对象

Maven上传问题-手动与401_mvn 本地上传jar,401-程序员宅基地

文章浏览阅读1.4k次。Maven上传问题注意: 如非必要, 请不要手动上传jar包, 手动上传如果遗漏pom文件, 会导致jar包内的pom依赖丢失, 这样上传的包在被使用时会产生依赖丢失的报错私服jar包结构手动上传的jar生成的pom原始pom1.手动上传快照版本maven不支持手动上传snapshot版本jar包到nexus, 当需要上传快照版本时, 需要用命令上传1.配置 maven安装目录conf/settings.xml(注意此处是安装目录的setting.xml,不是.m2下的,而且由于我们命令_mvn 本地上传jar,401

vue中css样式只在当前vue中生效_vue怎么让css只在此页面显示-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏3次。在设置style时,会影响到其他组件样式,为避免样式共享,可在样式style标签里添加scoped 即可_vue怎么让css只在此页面显示

datax-web在windows上环境搭建及同步数据测试_datax-web job execute end(finish) -----------<br>--程序员宅基地

文章浏览阅读8.6k次,点赞7次,收藏44次。datax-web部署说明:datax-web是一个集成datax和xxljob定时任务优秀的同步数据库开源框架。data-web开源地址:https://github.com/WeiYe-Jing/datax-web DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数._datax-web job execute end(finish) ---------------------- returnt:returnt

MYSQL, mybatis 如何使用自增主键_mybatis auto_increment-程序员宅基地

文章浏览阅读2.5k次。通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键。本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值:通过JDBC2.0提供的insertRow()方式 通过JDBC3.0提供的getGeneratedKeys()方式 通过SQL select LAST_INSERT_ID()函数 通过SQL @@IDENTITY 变量1.通过JDBC2.0提供的insertRow()方式自jdbc2.0以来,可以通过下面的方式执._mybatis auto_increment

随便推点

材质面向摄像机_ue5 通过材质使面片始终朝向摄像机-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏10次。材质面向摄像机单贴图面向摄像机组合贴图面向摄像机单贴图面向摄像机主要是调用RotateAboutAxis这个材质函数输入旋转轴 001计算旋转角度去除camera的z轴影响算出物体到摄像机的向量归一化后算出夹角FVector::Rotation()函数的内部实现(局部)FRotator R; // Find yaw.R.Yaw = FMath::Atan2(Y,X) * (180.f / PI); // Find pitch.R.Pitch = FMath_ue5 通过材质使面片始终朝向摄像机

轻松搞定 android MVP 架构、okHttp 网络模块封装 的 项目_android mvp网络封装-程序员宅基地

文章浏览阅读373次。CommonMvp MVP 框架的 使用commonMvp 能做什么?1、mvp 实现 model view presenter 业务和界面解耦2、整合 网络 请求3、简化网络调用流程4、整合状态栏和标题栏 实现沉浸式 状态栏5、Activity 、Fragment 中 使用方法 一致 接口式封装 生命周期1、有问题请 提交 isuue/(QQ:194093798) 谢谢大家 持续更新2、为新手提供一个 可靠 可用的 mvp 框架结构集成allprojects { repos_android mvp网络封装

flash详解_read parameter page-程序员宅基地

文章浏览阅读2.5w次,点赞62次,收藏496次。1.2.1. 什么是FlashFlash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,..._read parameter page

杰里之AI SDK 自定义命令操作流程】【篇】_杰里sdk-程序员宅基地

文章浏览阅读328次。APP 异步发数据给固件的操作流程:使 用 杰 理 的 APP , 不 开 放 自 定 义 services , 需 要 添 加 自 定 义 操 作 , 只 能 通 过 自 定 义 命 令JL_OPCODE_CUSTOMER_USER,利用这个通道去封装自己需要的功能。类似于提供一个 BLE 的串口功能。固件异步发数据给 APP 流程:..._杰里sdk

APP安全测试工具_QARK初探-程序员宅基地

文章浏览阅读9.7k次。1、简介检测android应用程序安全漏洞,可以用于已打包但是未加固的app或者源代码。https://github.com/linkedin/qark2、安装要求Tested on Python 2.7.13 and 3.6 Tested on OSX, Linux, and Windows现有win10安装pip install qark安装成功后可以使用一下命令查看qark --help安装反编译工具_jadx:https:._qark

校验码——奇偶校验码详解,码距,例题_奇偶校验题目-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏18次。相关文章: 校验码——码距 校验码——海明码及码距 校验码——CRC循环冗余校验码 一、码距二、奇偶校验码 奇偶校验码是一种增加二进制传输系统最小距离的简单和广泛采用的方法。例如,单个的奇偶校验将使码的最小距离由一增加到二。 一个二进制码字,如果它的码元有奇数个1,就称为具有奇性。例如,码字“10110101”有五个1,因此,这个码字具有奇性。同样,偶性码字具有偶数个1。注意奇性检测等效于所有码元的模二加,..._奇偶校验题目

推荐文章

热门文章

相关标签