问题:全排列-求解密码
题目描述
有某个系统需要密码才可以进入,现已知密码中的字符组合为字符串s中的字符(s<=6,s中的每一个字符都是英文字母,没有数字),但不知其排列顺序,请你编写程序,显示出该字符串中元素的所有组合(注意:会出现重复情况)
如果您采用哈希函数来消除重复,请使用如下公式来计算哈希值:
result = s[i] + (result << 6) + (result << 16) - result;
result = result & 0x7fffffff;
输入
一个字符串
输出
该字符串的所有组合
样例输入
abcc
样例输出
abcc acbc accb bacc bcac bcca cabc cacb cbac cbca ccab ccba
1 #include<stdio.h> 2 #include<string.h> 3 char str1[1000][10]; 4 int y=0; 5 void fun(char str[],int k){ 6 int i,j; 7 char t; 8 if(k==strlen(str)){ 9 int a=y; 10 int h=0; 11 while(a--&&!strlen(str1[y])) 12 if(!strcmp(str,str1[a])){ 13 h++; 14 break; 15 } 16 if(!h) 17 printf("%s ",str); 18 strcpy(str1[y++],str); 19 } 20 for(i=k;i<strlen(str);i++){ 21 t=str[i]; 22 for( j=i-1 ; j>=k ; j-- ) 23 str[j+1]=str[j]; 24 str[k]=t; 25 fun(str,k+1); 26 t=str[k]; 27 for( j=k ; j<=i ; j++) 28 str[j]=str[j+1]; 29 str[i]=t; 30 } 31 } 32 int main(){ 33 char str[7]; 34 scanf("%s",str); 35 fun(str,0); 36 return 0; 37 }