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.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
随机推荐
- MySQL-基础-2
MySQL数据库介绍 • MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. • MySQL的历 ...
- Microsoft Remote Desktop 通过 .rdp 文件登录
最近在淘宝上买了「市场洞察」子账号,说是子账号,其实是需要登录到他们的 Windows 服务器上才能用的.并且子账号也是 5-6 个人共用的,且不说远程服务器很老又有延迟,经常是我想添加一个监控店铺或 ...
- vue3 项目 用 vue-video-player 做直播 ( 亲测可用 )
npm 安装 npm install --save vue-video-player npm install --save videojs-flash 1 <template> 2 < ...
- JVM(一)类加载器与类加载过程
JVM是面试必面的一个知识点,也是高级程序员必备的一个技能.以下是JVM整体核心内容,包括类加载系统,运行时数据区内部结构,执行引擎,本地方法接口. 首先来学习类的加载器,虚拟机把描述类的数据从Cla ...
- APT组织跟踪与溯源
前言 在攻防演练中,高质量的蓝队报告往往需要溯源到攻击团队.国内黑产犯罪团伙.国外APT攻击. 红队现阶段对自己的信息保护的往往较好,根据以往溯源成功案例来看还是通过前端js获取用户ID信息.mysq ...
- Python__bs4模块
1 - 导入模块 from bs4 import BeautifulSoup 2 - 创建对象 fp = open('./test.html','r',encoding='utf-8') soup = ...
- sql常用查询命令
目录 SQL Server常用查询命令: 查看当前时间 查询所有数据库名 查询当前使用的数据库名 查询前几条数据 去重查询 字段换名 查询不等于 查询在两个值之间数据 查询条件或 模糊匹配查询 查询为 ...
- web安全性测试——XSS跨站攻击
1.跨站攻击含义 XSS:(Cross-site scripting)全称"跨站脚本",是注入攻击的一种.其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布 ...
- Spring Dependency Injection浅析
Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件. 1.在UserService中提供一个get/set的name方法, ...
- Markdown快捷键详解(源自狂神说Java视频,整理版)
#加空格 表示是一个标题(一级标题)回车后直接生成 例下 Markdown学习 标题: ##(两个#号)空格加标题名字即为二级标题例下 二级标题 三个#号 加标题名字即为三级标题,与二级标题等有层级关 ...