有重复元素的全排列

 

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


 

你可能感兴趣的:(c,ini,input,permutation)