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