全排列

HDU 1716 排列2

最后都变了- 提交于 2020-04-04 01:46:13
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3107 Accepted Submission(s): 1220 Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。 Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。 Output 对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。 每组输出数据间空一行,最后一组数据后面没有空行。 Sample Input 1 2 3 4 1 1 2 3 0 1 2 3 0 0 0 0 Sample Output 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121

分治法求解全排列问题

给你一囗甜甜゛ 提交于 2020-03-29 17:56:11
问题 A: 分治法求解全排列问题 时间限制: 1 Sec 内存限制: 128 MB 提交: 2896 解决: 1431 [ 状态 ] [ 讨论版 ] [ 提交 ] [命题人: 外部导入] 题目描述 设R=(1, 2, .., n),计算R的全排列。 分治法求解全排列的算法思想: 设R=(1, 2, .., n)的全排列为P(R), 若R=(),则P()=(); 否则,P(R)={(1)P(2, 3, .., n),(2)P(1, 3, .., n), (3)P(2, 1, .., n), .., (n)P(2, .., n-1, 1)}; 同样地,P(2, 3, .., n)={(2){3, 4, .., n}, (3){2, 4, .., n}, .., (n){3, .., n-1, 2}} 输入 输入为一组不大于7的整数。 输出 对每个输入的整数n,用分治法计算并输出1..n的全排列。 样例输入 Copy 1 2 3 样例输出 Copy 1 1 2 2 1 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 AC代码 #include<iostream> #include<algorithm> using namespace std; int n; int a[1005]; void per(int n,int m) { if (m == n) { for

康托展开(数论)

眉间皱痕 提交于 2020-03-25 02:53:44
康托展开 标签: 数学方法——数论 阅读体验: https://zybuluo.com/Junlier/note/1174122 一、定义 来自网络的定义: 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩。 设有n个数 \((1,2,3,4,...,n)\) ,可以有组成不同( \(n!\) 种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素的全排列中的名次。 通俗来讲: 假设有一个 排列 {1,2,3,4,5},需要你在它的全排列中,找到排名第m的那个排列 全排列的顺序就是字典序越来越大的排列,和我们的 next_permutation() 函数的顺序一样 二、怎么实现? 首先,放一个很重要的公式(暂时不需要理解,后面慢慢就懂了): \[X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! \] 其中 $ ! $ 是阶乘的意思 我们再看一个表格 你先不管它的康托展开那一栏,根据后面的讲解再看 排列组合 名次 康托展开 123 1 0 * 2! + 0 * 1! + 0 * 0! 132 2 0 * 2! + 1 * 1! + 0 * 0! 213 3 1 * 2! + 0 * 1! + 0 * 0! 231 4 1 * 2! + 1 * 1! + 0 * 0! 312 5 2 * 2!

字典序算法

和自甴很熟 提交于 2020-03-22 18:01:53
全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。 字典序法 按照字典序求下一个排列的算法 /* 例 字符集 {1,2,3}, 较小的数字较先 , 这样按字典序生成的全排列是 :123,132,213,231,312,321 。 注意 一个全排列可看做一个字符串,字符串可有前缀、后缀。 */ 生成给定全排列的下一个排列 所谓一个 全排列 的下一个排列就是这一个排列与下一个排列之间没有其他的排列。这就要求这一个排列与下一个排列有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。 /* 例 839647521 是 1 — 9 的排列。 1 — 9 的排列最前面的是 123456789 ,最后面的是 987654321 ,从右向左扫描若都是增的,就到了 987654321 ,也就没有下一个了。否则找出第一次出现下降的位置。 算法: 由 P 1 P 2 …P n 生成的下一个排列的算法如下: 1. 求 i=max{j| P j-1 <P j } 2. 求 l =max{k| P i-1 <P k } 3. 交换P i-1 与P l 得到 P 1 P 2 … P i-1 ( P i.... P n ) , 将红色部分顺序逆转,得到结果. 例 求 8396 4 7521 的下一个排列 1. 确定i,从左到右两两比较找出后一个数比前一个大的组合

全排列算法--递归实现(Java)

我的梦境 提交于 2020-03-20 11:06:00
求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。 首先举一个简单的例子说明算法的原理,既然是递归,首先说明一下出口条件。以[1, 2]为例 首先展示一下主要代码(完整代码在后面),然后简述   //对数组array从索引为start到最后的元素进行全排列 public void perm(int[]array,int start) { if(start==array.length) { //出口条件 for(int i=0;i<array.length;i++) { // this.result[row][i] = array[i]; System.out.print(array[i]+" "); } // System.out.print(++this.row+": "); // System.out.println("逆序数是:"+ this.against(array)); System.out.print('\n'); } else { for(int i=start;i<array.length;i++) { swap(array,start,i); //交换数组array中索引为start与i的两个元素 perm(array,start+1); swap(array,start,i); } } } 首先数组[1, 2]分析

大一新生备战2020蓝桥杯

纵然是瞬间 提交于 2020-03-08 18:43:32
一:错误票据 关键字:排序 题目: 资源限制时间限制:1 .0s 内存限制:256.0MB问题描述 某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。 输入格式 要求程序首先输入一个整数N(N<100)表示后面数据行数。 接着读入N行数据。 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。 每个整数代表一个ID号。 输出格式 要求程序输出1行,含两个整数m n,用空格分隔。 其中,m表示断号ID,n表示重号ID 样例输入1 2 5 6 8 11 9 10 12 9 样例输出1 7 9 样例输入2 6 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103 131 133 169 158 128 102 110 148 139 157 140 195 197 185 152

python实现克莱姆法则

拟墨画扇 提交于 2020-03-05 20:25:55
文章目录 首先完成python模拟行列式运算 公式分析 模块分析与实现 环境 模块导入 全排列 逆序数 方阵计算 克莱姆法则 *Cramer's rule* 注:本文对numpy对象使用append方法时均使用了深拷贝deepcopy,因为python中对象的赋值是按引用传递的,如果不使用深拷贝在append时会改变原有对象从而覆盖原先的值 首先完成python模拟行列式运算 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ = ∑ ( − 1 ) t a 1 p 1 a 2 p 2 ⋯ a n p n \begin{vmatrix} {a_{11}}&{a_{12}}&{\cdots}&{a_1n}\\ {a_{21}}&{a_{22}}&{\cdots}&{a_2n}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {a_{n1}}&{a_{n2}}&{\cdots}&{a_{nn}}\\ \end{vmatrix}= \sum{(-1)^{t}}{a_{1p_{1}}a_{2p_{2}}}{\cdots}{a_{np_{n}}} ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ∣ ​ a 1 1 ​ a 2 1 ​ ⋮ a n 1 ​ ​ a 1 2 ​ a 2 2 ​ ⋮

全排序

独自空忆成欢 提交于 2020-03-04 07:43:26
可以想象有4个盒子分别放4样或3样物品。 A44:第一个物品有4种放法,第二个3种,第三个2种,最后一个1种,所以4*3*2*1=24种。 A43:第一个物品有4种放法,第二个3种,第三个2种,所以4*3*2=24种。 还可以套公式 ANR = n/(n-r) A44 = 4*3*2*1 / 0= 24 ( 0的阶乘=1) A43 = 4*3*2*1 / 1= 24( 1的阶乘也=1) 扩展资料: 全排列的计算方法: 字典序法 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。 [例]字符集{1,2,3},较小的数字较先, 这样按字典序生成的全排列是:123,132,213,231,312,321。 [注意] 一个全排列可看做一个字符串,字符串可有前缀、后缀。 1)生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。 [例]839647521是1--9的排列。 1—9的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到987654321,也就没有下一个了。否则找出第一次出现下降的位置。 邻位对换法 递减进位制数法的中介数进位不频繁,求下一个排列在不进位的情况下很容易。 这就启发我们

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

我们两清 提交于 2020-03-01 01:38:27
请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。 输入格式: 输入给出正整数n(<10)。 输出格式: 输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a ​1 ​​ ,a ​2 ​​ ,⋯,a ​n ​​ 排在序列b ​1 ​​ ,b ​2 ​​ ,⋯,b ​n ​​ 之前,如果存在k使得a ​1 ​​ =b ​1 ​​ ,⋯,a ​k ​​ =b ​k ​​ 并且 a ​k+1 ​​ <b ​k+1 ​​ 。 输入样例: 3 输出样例: 123 132 213 231 312 321 #include<cstdio> #include<cstring> #include<math.h> int num[]={1,2,3,4,5,6,7,8,9}; int n; int a[10]; int t[10]; void dfs(int m); int main() { scanf("%d",&n); dfs(0); return 0; } void dfs(int m) { if(n==m) { for(int j=0;j<n;j++) { printf("%d",a[j]); } puts(""); return; } else { for(int i=0;i<n;i++) { if

leetcode菜狗入门 | 46. 全排列

≡放荡痞女 提交于 2020-02-27 21:58:26
全排列 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入 : [ 1 , 2 , 3 ] 输出 : [ [ 1 , 2 , 3 ] , [ 1 , 3 , 2 ] , [ 2 , 1 , 3 ] , [ 2 , 3 , 1 ] , [ 3 , 1 , 2 ] , [ 3 , 2 , 1 ] ] 解题思路 运用普通的回溯 代码(C++) class Solution { public : vector < int > cur ; vector < vector < int >> res ; vector < vector < int >> permute ( vector < int > & nums ) { // if(nums.size() == 0) // return nums; backtrace ( nums , nums . size ( ) ) ; return res ; } void backtrace ( vector < int > & nums , int n ) { if ( n == 0 ) { res . push_back ( cur ) ; return ; } for ( int i = 0 ; i < nums . size ( ) ; i ++ ) { vector < int > :: iterator temp