生成可重集的排列

来源:互联网 发布:工业生产总值数据 编辑:程序博客网 时间:2024/06/02 08:55

输入数组p,并按字典序输出数组A各元素的所有全排列。

#include<cstdio>#include<cstring>#include<cstdlib>void print_permutation(int n,int *p,int *A,int cur){    int i, j;    if(cur == n)    {        for(i = 0; i < n; i++) printf("%d ",A[i]);        printf("\n");    }    else for(i = 0; i < n; i++)    {        if(!i || p[i] != p[i-1])        {            int c1 = 0, c2 = 0;            for(j = 0; j < cur; j++) if(A[j] == p[i]) c1++;            for(j = 0; j < n; j++) if(p[i] == p[j]) c2++;            if(c1<c2)            {                A[cur] = p[i];                print_permutation(n,p,A,cur+1);            }        }    }}int main(){    int n, A[100], cur = 0;    int p[100];    scanf("%d",&n);    for(int i = 0; i < n; i++)        scanf("%d",&p[i]);    print_permutation(n,p,A,cur);}


C++的STL中提供一个库函数next_permutation.

#include<cstdio>#include<algorithm>using namespace std;int main(){    int n, p[10];    scanf("%d",&n);    for(int i = 0; i < n; i++)        scanf("%d",&p[i]);    sort(p,p+n);    do    {        for(int i = 0; i < n; i++) printf("%d",p[i]);        printf("\n");    } while(next_permutation(p,p+n));    return 0;}


0 0