有重复元素的排列问题

有重复元素的排列问题 

【问题描述】

       设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);
}

重复元素排列需要统计每个字符出现的次数,以及将字符去重存到另一个数组中。再利用回溯法进行全排列!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值