重複する要素の全配置
1529 ワード
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;
}