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 }