看板 C_and_CPP 關於我們 聯絡資訊
不知道你原本是用兩兩交換的方式來排列的嗎?? 如果是的話,要處理重複只要加個 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