# include <stdio.h> # include <string.h> char s[100]; int n = 0; int t = 0; int flage = 0;//描述两个数组是一样的 char Str[100][100]; //数据交换 void swap(char *a, char *b) { char m; m = *a; *a = *b; *b = m; } void circle_right(char a[],int m,int i) { char temp; int j,k; for(k=1;k<=i-m;k++) { temp=a[i]; for(j=i;j>m;j--) { a[j]=a[j-1]; } a[m]=temp; } } void circle_left(char a[],int m,int i) { char temp; int j,k; for(k=1;k<=i-m;k++) { temp=a[m]; for(j=m;j<i;j++) { a[j]=a[j+1]; } a[i]=temp; } } void perm(int k,char a[],int l) { int i; if(k == 1) { //将我们现在的组合复制进存储数组中,以备后面进行查询是否有重复 for(i = 0; i < l; i++) { Str[t][i] = s[i]; } t++; //这里进行比较 for(int s1 = 0; s1 < t-1; s1++)//这里比较是否有重复数组 { int eq = 1; for(int s2 = 0; s2 <= l; s2++)//这个用来比较两个数组是否一样 { if(Str[t-1][s2] != Str[s1][s2]) { eq = 0; } } if(eq == 1) flage = 1; } if(flage == 0) { for(i = 0; i < l; i++) printf("%c", s[i]); printf("/n"); n++; } else flage = 0; } for(i = 0; i < k; i++) { swap(&a[0], &a[i]); circle_right(a,1,i); perm(k-1,&a[1],l); circle_left(a,1,i); swap(&a[i], &a[0]); } } int main() { int l; gets(s); l=strlen(s); perm(l,s,l); printf("total:%d/n", n); return 0; }