PTA数据结构 习题2.8 输出全排列 (20分)
习题2.8 输出全排列 (20分)
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:
输入给出正整数n(<10)。
输出格式:
输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1,a2,⋯,an排在序列b1,b2,⋯,bn之前,如果存在k使得a1=b1,⋯,ak=bk并且 ak+1 < bk+1。
输入样例:
3
输出样例:
123
132
213
231
312
321
全排列字典序算法
全排列生成算法
 所谓字典序,就是将元素按照字典的顺序(a-z,1-9)进行排列。strcmp就是以字典序来比较字符串。
字典序算法步骤
设P是集合
{
1
,
2
,
.
.
.
.
.
.
n
−
1
,
n
}
\{1,2,......n-1,n\}
{1,2,......n−1,n}
 的一个全排列:P0P1…Pj-1PjPj+1…Pn
集合必须按照递增顺序排列好
- 从下标
n开始递减,找出第一个比右边数字小的数字序号iP
i
<
P
i
+
1
P_i<P_{i+1}
Pi<Pi+1
 - 在Pi右边的数字里,找到所有比Pj大的数字中最小的数字Pk,即
k
=
min
{
i
∣
P
i
>
P
j
,
i
>
j
}
k=\min\{i|P_i>P_j,i>j\}
k=min{i∣Pi>Pj,i>j}
 - 交换Pi,Pj
 - 将
i右边的序列Pi+1Pi+2…Pn逆置,变为PnPn-1…Pi+1 
C++代码如下
#include <iostream>
#include <cstdio>
int
fact( int n );
void
dictSeq( int a[], int n );
void
reverse( int a[], int n, int j );
void
swaq( int &a, int &b );
void
print_array( int a[], int n );
int
main( void )
{
	int *a;
	int n;
	scanf("%d", &n);
	a = new int[n];
	for( int i = 0; i < n; i++ ){
		a[i] = i+1;
	}
	int total = fact(n);	//全排列个数等于n!
	print_array( a, n );	//初始序列算一种排列, 在交换之前单独输出
	for( int i = 1; i < total; i++ ){	//让dictSeq执行total-1次, 输出除初始序列之后的所有可能
		dictSeq( a, n );
	}
	return 0;
}
void
dictSeq( int a[], int n )
{
	int i;
	for( i = n-1; i > 0; i-- ){
		if( a[i-1] < a[i] ){
			i--;
			break;
		}
	}
	int min_j = i + 1;
    int min = a[min_j];
	for( int j = min_j; j < n; j++ ){
		if( a[j] > a[i] && min > a[j] ){
			min = a[j];
			min_j = j;
		}
	}
	swaq( a[min_j], a[i] );
	reverse( a, n, i );
	print_array( a, n );
}
void
reverse( int a[], int n, int i )
{
	int left = i + 1, right = n - 1;
	while( left < right ){
		swaq( a[left++], a[right--]);
	}
}
int
fact( int n )
{
	int fact = 1;
	do{
		fact *= n--;
	}while( n > 0 );
	return fact;
}
void
swaq( int &a, int &b )
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
void
print_array( int a[], int n )
{
	for( int i = 0; i < n; i++ ){
		printf("%d", a[i]);
	}
	printf("\n");
}
												
											PTA数据结构 习题2.8 输出全排列 (20分)的更多相关文章
- PTA数据结构 习题2.1 简单计算器 (20分)
		
习题2.1 简单计算器 (20分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算 ...
 - PTA 7-1 邻接矩阵表示法创建无向图 (20分)
		
PTA 7-1 邻接矩阵表示法创建无向图 (20分) 采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶 ...
 - 1043 输出PATest (20 分)
		
题目:1043 输出PATest (20 分) 给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然, ...
 - PTA数据结构 习题3.6 一元多项式的乘法与加法运算 (20分)
		
一元多项式的乘法与加法运算 https://pintia.cn/problem-sets/434/problems/5865 设计函数分别求两个一元多项式的乘积与和. 时间限制:200 ms 内存限制 ...
 - L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧
		
上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...
 - B1043 输出PATest (20 分)
		
一.技术总结: 对于哈希字符处理方式,一般是用一个数组存储字符出现的次数,然后再考虑后续. 同时,在输出时,比如这题要输出指定几个字符,我们可以首先统计下这几个字符一共出现的次数sum,然后输出一个就 ...
 - PAT Basic 1043 输出PATest (20 分)
		
给定一个长度不超过   的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符 ...
 - 1043 输出PATest (20 分)C语言
		
给定一个长度不超过 10^4的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
 - PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
		
给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
 
随机推荐
- IPv6 QoS 多媒体应用:性能分析 (上)
			
IPv6 QoS 多媒体应用:性能分析 Assured Forwarding (AF):保证转发 Expedited Forwarding (EF):快速转发 Traffic aggregatio ...
 - 记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析
			
一:背景 1. 讲故事 这是6月中旬一位朋友加wx求助dump的故事,他的程序 cpu爆高UI卡死,问如何解决,截图如下: 在拿到这个dump后,我发现这是一个关于机械臂的MRS程序,哈哈,在机械臂这 ...
 - ELK 收集 Tomcat日志以及修改Tomcat日志格式
			
ELK 收集 Tomcat日志以及修改Tomcat日志格式 Tomcat日志 想要收集tomcat 日志 首先我们要对tomcat的日志有足够的了解 tomca日志分类 简单的说tomcat logs ...
 - Linux复习笔记-001-进程的管理
			
1.什么是进程? 进程是已经启动的可执行的程序运行实例. 程序是二进制文件,静态 ./bin/date/ /usr/sbin/ 进程:是程序运行的过程 2.Linux为1的进程? centos5或6为 ...
 - RabbitMQ-如何保证消息在99.99%的情况下不丢失
			
1. 简介 MQ虽然帮我们解决了很多问题,但是也带来了很多问题,其中最麻烦的就是,如何保证消息的可靠性传输. 我们在聊如何保证消息的可靠性传输之前,先考虑下哪些情况下会出现消息丢失的情况. 首先,上图 ...
 - 转:C# PDFbox读取PDF内容
			
using System; using System.Windows.Forms; using org.apache.pdfbox.pdmodel; using org.apache.pdfbox.u ...
 - CSS001. 纯CSS实现瀑布流(纵向排序)
			
通过 Multi-columns 相关的属性 column-count.column-gap 配合 break-inside 来实现瀑布流布局. 首先对包裹图片的盒子增加样式,column-count ...
 - javaScript对象——function对象
			
1.基本对象和Function(函数)方法对象 2.概念 3.创建function对象的三种方式: 第一种不建议使用 2.3两种方式就是方法名位置不同,建议使用: 4.方法调用只要名字对,实参不一定完 ...
 - 第23篇-虚拟机对象操作指令之getstatic
			
Java虚拟机规范中定义的对象操作相关的字节码指令如下表所示. 0xb2 getstatic 获取指定类的静态域,并将其值压入栈顶 0xb3 putstatic 为指定的类的静态域赋值 0xb4 ge ...
 - Spring Cloud Eureka 之服务端自我注册
			
Eureka服务端实现了一种自我注册机制,涉及配置项: eureka.client.register-with-eureka spring.application.name Eureka Server ...