UVA 195 Anagram
7373 ワード
タイトル:文字列のすべての組み合わせを入力することを求めて、辞書の順序によって出力します!
解法:列挙(列挙前に最も文字列の最小辞書順を見つける)を使用して列挙する場合に列挙生成条件を加算します.
解法:列挙(列挙前に最も文字列の最小辞書順を見つける)を使用して列挙する場合に列挙生成条件を加算します.
1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 using namespace std;
5
6 bool comp(char ch1,char ch2){
7 if(ch1 - ch2 == 32){
8 return false;
9 }
10 if (ch2 - ch1 == 32){
11 return true;
12 }
13 if(ch1 >= 'a' && ch2 <='Z')
14 {
15 return ch1 - 32 < ch2;
16 }
17 else if(ch1 <='Z' && ch2 >= 'a')
18 {
19 return ch1 + 32 < ch2;
20 }
21 else{
22 return ch1 < ch2;
23 }
24
25 }
26 // comp() below can also meet our need
27 /**
28 int compute(char ch){
29 if(ch>='a' && ch<='z')
30 return (ch-'a')*2 +1;
31 else if(ch>='A' && ch<='Z')
32 return (ch-'A')*2;
33 else
34 return 0;
35 }
36 bool comp(char ch1,char ch2){
37 return compute(ch1)<compute(ch2);
38 }
39 **/
40 int main()
41 {
42 int in,n;
43 cin>>in;
44
45 while(in--)
46 {
47 string s;
48 cin>>s;
49 n=s.length();
50 sort(s.begin(),s.end(),comp);
51 do{
52 cout<<s<<endl;
53 // comp()
54 }while(next_permutation(s.begin(),s.end(),comp));
55 }
56 return 0;
57 }