内容 :
給你一些字元(字串),請你從這些字元產生所有可能的組合。
例如:給你"abc",你的程式應該要產生"abc", "acb", "bac", "bca", "cab" , "cba"
輸入的字元可能會有重複的,但輸出請不要有重複的字串出現。字串輸出的次序請依字元次序遞增。字元次序:AaBbCcDd.....YyZz。
输入说明 :
第1列有一個整數 n,代表接下來有n列測試資料。每列測試資料由大寫或小寫的英文字元組成。大小寫請視為不同的字元。
输出说明 :
每一筆測試資料請輸出所有可能的組合,每種組合一列。輸出的次序請依字元次序遞增。請參考Sample Output。
范例输入 :
3 abc acba BaA
范例输出 :
abc acb bac bca cab cba aabc aacb abac abca acab acba baac baca bcaa caab caba cbaa AaB ABa aAB aBA BAa BaA
提示 :
Lucky 貓
出处 :
(管理:snail)
Code:
1 // 以下程式碼由 sagit 所撰寫,學術使用可自由轉載,但請註明本站網址。 2 // Sagit's ACM Code: http://www3.tcgs.tc.edu.tw/~sagit/acm/ 3 4 #include <iostream> 5 #include <cstring> 6 #define N 81 7 8 using namespace std; 9 10 char ch[N], ans[N]; 11 int num[N], kind, total; 12 13 int Order(char c) 14 { 15 return ( (c>='A') && (c<='Z') ) ? (c-'A')*2 : (c-'a')*2+1; 16 } 17 18 void Init(char s[]) 19 { 20 int i, j, k, t1; 21 char t2; 22 kind=0; 23 total=strlen(s); 24 ans[total]=0; 25 for (i=0; i<total; i++) 26 { 27 for (j=0; j<kind; j++) 28 if(s[i]==ch[j]) break; 29 if(j<kind) num[j]++; 30 else 31 { 32 ch[kind]=s[i]; 33 num[kind]=1; 34 kind++; 35 } 36 } 37 for (i=0; i<kind-1; i++) 38 { 39 for (j=i+1, k=i; j<kind; j++) 40 if(Order(ch[j])<Order(ch[k])) k=j; 41 t1=num[i], t2=ch[i]; 42 num[i]=num[k], ch[i]=ch[k]; 43 num[k]=t1, ch[k]=t2; 44 } 45 } 46 47 void Perm(int n) 48 { 49 int i, j; 50 if(n>=total) 51 { 52 cout << ans << endl; 53 return; 54 } 55 for (i=0; i<kind; i++) 56 { 57 if(num[i]<=0) continue; 58 ans[n]=ch[i]; 59 num[i]--; 60 Perm(n+1); 61 num[i]++; 62 } 63 } 64 65 int main() 66 { 67 int n, i; 68 char s[N]; 69 cin >> n; 70 for (i=0; i<n; i++) 71 { 72 cin >> s; 73 Init(s); 74 Perm(0); 75 } 76 //system("PAUSE"); 77 return 0; 78 }
引用转载自sagit撰写的代码,sagit拥有所有的解释权。
sagit要求注明的网址:
Sagit's ACM Code: http://www3.tcgs.tc.edu.tw/~sagit/acm/