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

被折叠的 条评论
为什么被折叠?



