2011-08-23 16:00:21Morris
d781. 195 - Anagram
d781. 195 - Anagram
內容 :
給你一些字元(字串),請你從這些字元產生所有可能的組合。
例如:給你"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 貓
出處
:
/**********************************************************************************/
/* Problem: d781 "195 - Anagram" from UVa ACM 195 */
/* Language: C */
/* Result: AC (12ms, 186KB) on ZeroJudge */
/* Author: morris1028 at 2011-08-23 15:58:15 */
/**********************************************************************************/
#include<stdio.h>
int time[52] = {}, N;
char s[100];
void DFS(int now) {
int a;
if(now == N) {
s[now] = '\0';
puts(s);
return;
}
for(a = 0; a < 52; a++)
if(time[a] > 0) {
time[a]--, s[now] = a&1 ? (a/2+'a') : (a/2+'A');
DFS(now+1);
time[a]++;
}
}
main() {
int t, a;
char s[1000];
scanf("%d", &t);
while(t--) {
scanf("%s", s);
for(a = 0; a < 52; a++) time[a] = 0;
for(a = 0; s[a]; a++) {
if(s[a] >= 'a') time[(s[a]-'a')*2+1]++;
else time[(s[a]-'A')*2]++;
}
N = a, DFS(0);
}
return 0;
}