枚举排列

#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;
}

你可能感兴趣的:(ACM,全排列)