枚举排列
来源:互联网 发布:软件开发标准流程 编辑:程序博客网 时间:2024/05/22 09:45
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;/** 输入整数n,按字典序从小到大的顺序输出前n个数的所有排列。**/// 生成1~n的排列void print_permutation(int *A, int n, int cur) { // 递归边界 if(cur == n) { for(int i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n"); } else { // 尝试在A[cur]中填各种整数i for(int i = 1; i <= n; i++) { int ok = 1; for(int j = 0; j < cur; j++) { // 不能选已在集合A中的整数 if(A[j] == i) { ok = 0; } } if(ok) { A[cur] = i; print_permutation(A, n, cur + 1); } } }}/** 输入数组P,(数组P中元素有序),并按字典序输出数组A各元素的所有全排列。**/// 生成可重集的排列void print_permutation2(int *A, int *P, int n, int cur) { // 递归边界 if(cur == n) { for(int i = 0; i < n; i++) { cout << A[i] << " "; } cout << endl; } else { for(int i = 0; i < n; i++) { // 因为数组P中元素有序 // 所以只需要判断i与i-1是否相同 // 就可以使下标i不重复 if(!i || P[i] != P[i - 1]) { // c1为该数在A中出现次数,c2位该数在P中出现次数 int c1 = 0, c2 = 0; for(int j = 0; j < cur; j++) { if(A[j] == P[i]) { c1++; } } for(int j = 0; j < n; j++) { if(P[j] == P[i]) { c2++; } } // A中该数已出现次数小于P中该数总出现次数 // 则还可以添加到A中 if(c1 < c2) { A[cur] = P[i]; print_permutation2(A, P, n, cur + 1); } } } }}// 通过库函数next_permutation输出全排列void print_permutation3(int *p, int n) { sort(p, p + n); do { for(int i = 0; i < n; i++) { cout << p[i] << " "; } cout << endl; } while(next_permutation(p , p + n));}int main() { int A[1000]; int P[] = {1, 2, 3, 3};// print_permutation(A, 4, 0);// print_permutation2(A, P, 4, 0); print_permutation3(P, 4); return 0;}
0 0
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 关于排列枚举算法
- 递归枚举全排列
- 枚举全排列
- 枚举全排列
- JAVA基础之其他流程控制语句:循环嵌套
- Java核心技术体系
- Convention 插件(2)—— Annotation
- Struts2 HelloWorld!
- JAVA基础之函数
- 枚举排列
- 一个很不错的maven下载服务器
- Catalan数计算及其应用
- JAVA基础之数组
- Android Animation 遇到的一些问题
- 如何导入jstl标签
- JAVA基础之进制转换,查表法的应用
- SqlServer 按日期查表,没有数据的日期显示为0
- Python学习笔记:类(class)