习题2.8 输出全排列 (20分)

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。

输入格式:

输入给出正整数n(<10)。

输出格式:

输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a​1,a​2,⋯,an排在序列b​1,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

集合必须按照递增顺序排列好

  1. 从下标n开始递减,找出第一个比右边数字小的数字序号i

    P

    i

    <

    P

    i

    +

    1

    P_i<P_{i+1}

    Pi​<Pi+1​

  2. 在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}

  3. 交换Pi,Pj
  4. 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分)的更多相关文章

  1. PTA数据结构 习题2.1 简单计算器 (20分)

    习题2.1 简单计算器 (20分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算 ...

  2. PTA 7-1 邻接矩阵表示法创建无向图 (20分)

    PTA 7-1 邻接矩阵表示法创建无向图 (20分) 采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶 ...

  3. 1043 输出PATest (20 分)

    题目:1043 输出PATest (20 分) 给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然, ...

  4. PTA数据结构 习题3.6 一元多项式的乘法与加法运算 (20分)

    一元多项式的乘法与加法运算 https://pintia.cn/problem-sets/434/problems/5865 设计函数分别求两个一元多项式的乘积与和. 时间限制:200 ms 内存限制 ...

  5. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧

    上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...

  6. B1043 输出PATest (20 分)

    一.技术总结: 对于哈希字符处理方式,一般是用一个数组存储字符出现的次数,然后再考虑后续. 同时,在输出时,比如这题要输出指定几个字符,我们可以首先统计下这几个字符一共出现的次数sum,然后输出一个就 ...

  7. PAT Basic 1043 输出PATest (20 分)

    给定一个长度不超过 ​ ​​ 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符 ...

  8. 1043 输出PATest (20 分)C语言

    给定一个长度不超过 10^​4的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

  9. PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)

    给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

随机推荐

  1. 怎样去除EXCEL中的重复行

    工具/原料 安装了EXCEL2010的电脑一台 步骤/方法   假如我们的表格中有下图所示的一系列数据,可以看出其中有一些重复.   首先我们选中所有数据.可以先用鼠标点击"A1单元格&qu ...

  2. centos7 wget安装jdk

    2021-07-151. 环境介绍 操作系统:centos7 jdk版本:jdk1.8.0.211 2. 下载 进入 https://www.oracle.com/java/technologies/ ...

  3. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  4. Java反序列化漏洞Apache CommonsCollections分析

    Java反序列化漏洞Apache CommonsCollections分析 cc链,既为Commons-Collections利用链.此篇文章为cc链的第一条链CC1.而CC1目前用的比较多的有两条链 ...

  5. webService动态调用及返回至处理

    http://www.cnblogs.com/xffy1028/archive/2012/05/07/2487595.html using System; using System.Collectio ...

  6. ldconfig与 /etc/ld.so.conf

    现在我们知道了动态与静态函数库,也知道了当前的Linux大多是将函数库做成动态函数库,下面来讨论增加函数库读取性能的方法.我们知道,内存的访问速度是硬盘的好几倍,所以,如果将常用的动态函数库加载到内存 ...

  7. C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式

    C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...

  8. String底层使用是char数组还是byte数组

    结论:jdk1.8及以前String底层使用是char[],1.9开始使用byte[] jdk1.8 jdk13

  9. PHP中的PDO对象操作学习(一)初始化PDO及原始SQL语句操作

    PDO 已经是 PHP 中操作数据库事实上的标准.包括现在的框架和各种类库,都是以 PDO 作为数据库的连接方式.基本上只有我们自己在写简单的测试代码或者小的功能时会使用 mysqli 来操作数据库. ...

  10. PHPMailer实现发送邮件的方法介绍

    来自: https://www.php.cn/php-weizijiaocheng-408762.html PHPmailer请在github下载,或者直接百度,也不难,虽然PHPmailer里面一大 ...