不重复排列 POJ 1256 Anagram

生成不重复排列

类似DFS

这题卡在排序上了,后来看了别人的解题报告,受到启发

重写了排序算法,才AC掉

主要是排序不是按ASCII码排的


思路是先判断是否同一个字母大小写,

如果是,就直接判断大小,因为原来的ASC码 大写字母就比小写字母小

如果不是,就意味着两个是不同字母的大小写,都化成小写,再比较大小


别人都是用stl里的next_permutation和sort函数

我是完全自己写

 

Anagram
   
     
1 #include < iostream >
2 #include < string >
3
4
5   using namespace std;
6   enum { };
7   int used[ 15 ];
8   string a;
9 string b( 15 , ' ' );
10 string c;
11 int different_num;
12 void sort();
13 void unrepeat_permutation( int );
14 void inite();
15 int n;
16
17
18 int main()
19 {
20 int num;
21 // freopen("test.txt", "r", stdin);
22
23 cin >> num;
24
25 for ( int i = 0 ; i < num; i ++ )
26 {
27 cin >> a;
28 n = a.length();
29
30 sort();
31 inite();
32
33 unrepeat_permutation( 0 );
34
35 }
36 return 0 ;
37 }
38
39
40 void unrepeat_permutation( int current)
41 {
42 if (current == n)
43 {
44 cout << c << endl;
45
46 }
47 else
48 {
49 for ( int i = 0 ; i < different_num; i ++ )
50 {
51 if (used[i])
52 {
53 used[i] -- ;
54 c[current] = b[i];
55 unrepeat_permutation(current + 1 );
56 used[i] ++ ;
57 }
58 }
59 }
60 }
61
62 void inite()
63 {
64 different_num = 1 ;
65 b[ 0 ] = a[ 0 ];
66 for ( int i = 0 ; i < a.length(); i ++ )
67 {
68 used[i] = 1 ;
69 }
70 for ( int i = 1 ; i < a.length(); i ++ )
71 {
72 if (a[i] != a[i - 1 ])
73 {
74 b[different_num ++ ] = a[i];
75 }
76 else
77 used[different_num - 1 ] ++ ;
78 }
79
80 c = string (n, ' ' );
81
82 }
83
84 void sort()
85 {
86 int k;
87 string ::value_type temp;
88 for ( int i = 0 ; i < a.length() - 1 ; i ++ )
89 {
90 k = i;
91 for ( int j = k + 1 ; j < a.length(); j ++ )
92 {
93 if (tolower(a[j]) == tolower(a[k]) )
94 {
95 if (a[j] < a[k])
96 {
97 k = j;
98 }
99 }
100 else
101 {
102 if (tolower(a[j]) < tolower(a[k]))
103 {
104 k = j;
105 }
106 }
107
108 }
109 if (k != i)
110 {
111 temp = a[i];
112 a[i] = a[k];
113 a[k] = temp;
114 }
115 }
116 }

 

你可能感兴趣的:(poj)