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.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
随机推荐
- kubernetes使用jenkins Pipeline 部署Nginx
文章原文 环境需求 kubernetes 未安装参考使用kubeadm安装kubernetes 1.21 jenkins github/gitee/gitlab 静态页面 镜像仓库(我使用的 hub. ...
- RabbitMQ之消息模式1
消息100%的投递 消息如何保障100%的投递成功? 什么是生产端的可靠性投递? 保障消息的成功发出 保障MQ节点的成功接收 发送端收到MQ节点(Broker)确认应答 完善的消息进行补偿机制 BAT ...
- SSH整合(二)
SSH框架实现登录.新闻增删改查.树形菜单 项目结构 pom.xml 网不好不要一次引入太多,容易下不全 <project xmlns="http://maven.apache.org ...
- Django的form组件基本使用——生成标签
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = ...
- SQL语句之基本使用
1.sql语法 一些重要的SQL命令: SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数 ...
- 1.26学习总结——css盒子模型
CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周围的H ...
- java web 项目中web.xml 详解
web.xml详述: web.xml 是每个Java web 项目的必备文件,又叫做部署描述符,Servlet规范中定义的,是web应用的配置文件. 概念: .部署描述符文件就像所有XML文件一样,必 ...
- PHP中的输出:echo、print、printf、sprintf、print_r和var_dump
大家在面试中,经常会被问到的问题: 请简要说明PHP的打印方式都有哪些? 或者直接点问: 请说明echo.print.print_r的区别 看着很简单,一般会出现在初中级的笔试题中.但是要真正说明白这 ...
- openFeign夺命连环9问,这谁受得了?
1.前言 前面介绍了Spring Cloud 中的灵魂摆渡者Nacos,和它的前辈们相比不仅仅功能强大,而且部署非常简单. 今天介绍一款服务调用的组件:OpenFeign,同样是一款超越先辈(Ribb ...
- Linux系列(20) - shutdown
作用 用于关机或重启 例子 [shutdown -h 05:30]:设定凌晨05:30关机 [shutdown -h +30]:30分钟后关机 [shutdown -h now] 立即关机 [shut ...