枚举排列

来源:互联网 发布:软件开发标准流程 编辑:程序博客网 时间: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
原创粉丝点击