重複する要素の全配置



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("
"); } 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; }