生成可重集的排列

来源:互联网 发布:江边城外 知乎 编辑:程序博客网 时间:2024/05/16 18:55
#include <cstdio>#include <cstring> int P[10];void print_permutation(int n,int * A,int cur){    if(n == cur)    {        for(int i = 0;i < n;i++)            printf("%d ",A[i]);        printf("\n");    }    else    {        for(int i = 0;i < n;i++) //已经有一个循环了 把所有的元素都考虑一遍             if(!i||P[i] != P[i - 1])              {                int c1 = 0,c2 = 0;                for(int j = 0;j < cur;j++)                     if(A[j] == P[i]) c1++; //在P中出现的次数                 for(int j = 0;j < n;j++)                    if(P[i] == P[j]) c2++;  //!判断是用 ==                 if(c1 < c2)                 {                    A[cur] = P[i];                    print_permutation(n,A,cur+1);                }            }    }  } int main(){    int A[50],n;    scanf("%d",&n);    memset(A,0,sizeof(A));    for(int i = 0; i < n ; i++ )        scanf( "%d", &P[i] );//scanf要写&!!!     print_permutation(n,A,0);    return 0;}

有了个有点像桶排序的方法表示元素在这个集合里出现的次数

#include <cstdio>#include <cstring>int num[10] = {}; void print_permutation(int n,int * A,int * P,int cur){    if(n == cur)    {        for(int i = 0;i < n;i ++)            printf("%d ",A[i]);        printf("\n");    }    else        for(int i = 0;i < n;i ++)            if(!i || P[i] != P[i - 1])                {                    int c1 = 0;                    for(int j = 0;j < cur;j ++)                        if(A[j] == P[i]) c1++;                    if(c1 < num[P[i]])                     {                        A[cur] = P[i];                        print_permutation(n,A,P,cur + 1);                    }                } } int main(){    int A[10],P[10],n;    scanf("%d",&n);    for(int i = 0;i < n;i ++)    {        scanf("%d",&P[i]);        num[P[i]] ++; //有点像桶排序的方法     }    print_permutation(n,A,P,0);    return 0;}