您的位置:首页 > 其它

生成可重集的排列

2014-07-24 16:31 309 查看
下面给出自己编写的代码:

#include<stdio.h>
int P[100],A[100];
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 i, n;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &P[i]);
print_permutation(n, P, A, 0);
return 0;
}


还有一种是调用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: