24h購物| | PChome| 登入
2011-08-23 16:00:21| 人氣1,202| 回應0 | 上一篇 | 下一篇

d781. 195 - Anagram

推薦 0 收藏 0 轉貼0 訂閱站台

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

台長: Morris
人氣(1,202) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:d242. Q481: What Goes Up
此分類上一篇:d750. 11321 - Sort! Sort!! and Sort!!!

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文