有重复元素的排列问题
【问题描述】
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。
【编程任务】
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
【输入格式】
由perm.in输入数据。文件的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
【输出格式】
计算出的n个元素的所有不同排列输出到文件perm.out中。文件最后1行中的数是排列总数。
【输入样例】
4
aacc
【输出样例】多解
aacc
acac
acca
caac
caca
ccaa
6
代码如下:
#include<stdio.h>
#define N 500
typedef struct Element ElemType;
struct Element
{
char c;
int times;
}a[500];
int size=0,cnt=0;//用来记录a数组里元素的个数
ElemType t[N];//里面装要输出的排列组合
void sort(ElemType a[])
{
ElemType temp;
int i,j,k;
for(i=0;i<size;i++)
{
k=i;
for(j=i+1;j<size;j++)
{
if(a[j].c<a[k].c)
{
k=j;
}
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
void Perm(int cur,int n)
{
int i,j;
if(cur==n)
{
for(i=0;i<n;i++)
{
printf("%c",t[i]);
}
cnt++;
printf("\n");
return;
}
for(i=0;i<size;i++)
{
if(a[i].times!=0)
{
t[cur].c=a[i].c;
a[i].times--;
Perm(cur+1,n);
a[i].times++;
}
}
}
int main()
{
int n,i,j;
char temp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i].times=0;
}
scanf(" %c",&a[size].c);
a[size++].times++;
for(i=1;i<n;i++)
{
scanf("%c",&temp);
for(j=0;j<size;j++)
{
if(temp==a[j].c)
{
a[j].times++;
break;
}
}
if(j==size)
{
a[size].times++;
a[size++].c=temp;
}
}
sort(a);
Perm(0,n);
printf("%d",cnt);
}
重复元素排列需要统计每个字符出现的次数,以及将字符去重存到另一个数组中。再利用回溯法进行全排列!
版权声明:本文为a13683857889原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。