您的位置:首页 > 其它

有重复元素的全排列

2011-07-31 20:41 148 查看
Description
输入n(<=10)个小些字母(可能重复),输出n个字符的全部排列。

Input

abaab

Output
1:aaabb

2:aabab

3:aabba

4:abaab

5:ababa

6:abbaa

7:baaab

8:baaba

9:babaa

10:bbaaa

#include<stdio.h>
#include<string.h>
char a[11];
char p[11];
int leap;   //标记个数
void qsort(char num[],int shangbiao,int xiabiao)  //将字符排序
{
	int i=shangbiao,j=xiabiao;
	int key=i;
	char t;
	if(shangbiao<xiabiao)
	{
		while(i<j)
		{
 			for(;j>key;j--)
			{
				if(num[j]<num[key])
				{
					t=num[j];
			    	num[j]=num[key];
			    	num[key]=t;
			     	key=j;
			    	break;
				}
			}
			i++;
			for(;i<key;i++)
			{
				if(num[i]>num[key])
				{
					t=num[i];
					num[i]=num[key];
					num[key]=t;
					key=i;
					break;
				}
			}
			j--;
		}
		qsort(num,shangbiao,key-1);
		qsort(num,key+1,xiabiao);
	}
}
void print_permutation(int n,char *p,char *a,int cur)  //重复元素排列
{
	int i,j;
	int ok=1;
	int c1=0,c2=0;
	if(cur==n)     
	{
		leap++;
		printf("%d:",leap);
		for(i=0;i<n;i++)
			printf("%c",a[i]);
		printf("\n");
	}
	else for(i=0;i<n;i++)   
	{
		if(!i||p[i]!=p[i-1])    //判断与前一个元素不相同
		{
			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 n;
	gets(p);
	n=strlen(p);
	qsort(p,0,n-1);
	print_permutation(n,p,a,0);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: