不知道你原本是用兩兩交換的方式來排列的嗎??
如果是的話,要處理重複只要加個 flag array 即可
如下 code: (紅色標起來的即是處理重複所加上的)
#include<stdio.h>
#include<string.h>
char str[BUFSIZ];
int count;
void perm(int index){
int i;
int flag[128]={0};
char tmp;
if(index){
for(i=index;i>=0;--i){
if(flag[str[i]]) continue;
flag[str[i]]=1;
tmp=str[index];
str[index]=str[i];
str[i]=tmp;
perm(index-1);
tmp=str[index];
str[index]=str[i];
str[i]=tmp;
}
}
else{
++count; /* do nothing, just count */
}
}
void main(){
scanf("%s",str);
perm(strlen(str)-1);
printf("%d\n",count);
}
※ 引述《liu2007 (薯)》之銘言:
: 我打算用遞迴寫字元的排列
: 可是這個字元陣列裡有時候可能會有重複的情況
: 譬如說
: a b c d e f # #
: 當這八個字元下去做排列的時候
: 理應只有 8!/2! 的答案
: 但是對於電腦來說還是有8!個答案
: 請問要怎麼樣避免這種狀況發生??
: 可否題點一下解決的方法@.@?
: 使用遞迴實在是好難......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.248.4.114