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 貓

出處 :

UVa ACM 195 (管理:snail)



作法 : 生成重複排列

/**********************************************************************************/
/*  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;
}