生成存在重复元素的全排列 (C语言实现)
#include<cstdio>
#include<cstring>
#define maxn 100
int A[maxn];
void print_permutation(int n, int* P, int* A,int cur)
{
if (cur == n) {
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, P, A, cur + 1);
}
}
else i++;
}
}
int main()
{
memset(A, 0, sizeof(A));
int a[] = { 1,1,1,2,3 };
print_permutation(5, a, A, 0);
return 0;
}