不重复排列 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 }