枚举排列----生成可重集的排列

输入数组P,按照字典序输出所有的P中元素的全排列

由于C/C++语言中的函数在接受数组参数的时候无法得知数组的元素个数所以需要传一个已经填好的位置个数,或者当前需要确定元素位置cur,还需要传输原始数组P,共四个参数

生成的排列有重复的所以需要统计A[0]-A[cur-1]中P[i]出现的次数c1,以及P数组中P[i]出现的次数c2,只要c1<c2就可以递归调用    还需要注意的是不重复由于数组P已经排过序,所以只需要比较P[i]!=P[i-1]即可

#include <cstdio>
#include <cstring>
#include <algorithm>

const int maxn = 1000;

using namespace std;
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, 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++;
                }
                if(c1 < c2)
                {
                    A[cur] = P[i];
                    print_permutation(n, A, P, cur+1);
                }
            }
        }
    }
}

int main()
{
    int a[maxn];
    int p[maxn];
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &p[i]);
    }
    sort(p, p+n);
    printf("----------------------------\n");
    print_permutation(n, a, p, 0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39459624/article/details/79231176