【ZeroJudge】d781 Anagram

内容 :

給你一些字元(字串),請你從這些字元產生所有可能的組合。

例如:給你"abc",你的程式應該要產生"abc", "acb", "bac", "bca", "cab" , "cba"

輸入的字元可能會有重複的,但輸出請不要有重複的字串出現。字串輸出的次序請依字元次序遞增。字元次序:AaBbCcDd.....YyZz。

输入说明 :

第1列有一個整數 n,代表接下來有n列測試資料。每列測試資料由大寫或小寫的英文字元組成。大小寫請視為不同的字元。

输出说明 :

每一筆測試資料請輸出所有可能的組合,每種組合一列。輸出的次序請依字元次序遞增。請參考Sample Output。

范例输入 :help

 
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)

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/

posted @ 2013-05-19 21:48  TonyFang  阅读(270)  评论(0编辑  收藏  举报