全排列圖解過程
#include<cstdio>
#include<cstdlib>
#include<cstring>
void dg(char str[],int k){
if(k==strlen(str)-1){
for(int j=0;j<=k;j++){
printf("%c",str[j]);
}
printf("\n");
return ;
}
//沒有重複字符的全排列
/*for(int i=k;i<strlen(str);i++){
char temp=str[k];
str[k]=str[i];
str[i]=temp;
dg(str,k+1);
temp=str[k];
str[k]=str[i];
str[i]=temp;
} */
//有重複字符的全排列
//因爲全排列是將不同元素依次換到當前位置後,再對後面的元素求全排列。
//如果將重複的元素多次換到當前位置的話,那麼就會出現相同的排列。
//爲了避免,我們禁止將相同的元素多次換到當前位置即可
//這樣我們也得到了在全排列中去掉重複的規則:去重的全排列就是
//從第一個數字起每個數分別與它後面非重複出現的數字交換。
for(int i=k;i<strlen(str);i++){
int t=i,ok=0;
for(int j=t+1;j<strlen(str);j++){
if(str[t]==str[j])
ok=1;
}
if(!ok){
char temp=str[k];
str[k]=str[i];
str[i]=temp;
dg(str,k+1);
temp=str[k];
str[k]=str[i];
str[i]=temp;
}
}
}
int main(){
char s[]={'A','B','C'},s1[]={'A','B','B'};
//dg(s,0);
dg(s1,0);
system("pause");
return 0;
}