有重复元素的排列问题

有重复元素的排列问题 

【问题描述】

       设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版权协议,转载请附上原文出处链接和本声明。