USACOTrainning.The Clocks

有九个Clock,只有4个点,然后有9种操作,可以推动某些Clock前进一个刻度,问说最少的操作数。

然后算错了4^9还是蛮小的=2^10 * 2^8=1024 * 256。

用4进制来表示闹钟完全可行的。

然后我就用了3个4进制数来表示,消耗(4^3)*(4^3)*(4^3)空间,空间是一样的,囧。

然后用Vector来BFS。

1 #include <iostream>
2 #include <string>
3 #include <algorithm>
4 #include <string.h>
5 #include <vector>
6 #include <math.h>
7 #include <time.h>
8 #include <queue>
9  using namespace std;
10
11  struct STA
12 {
13 int a, b, c; //表示3行的状态
14   int toward; //表示从哪个节点BFS过来的
15   int op; //操作的方法
16 STA(int aa, int bb, int cc) : a(aa), b(bb), c(cc)
17 {
18 toward = -1;
19 }
20 STA(int aa, int bb, int cc, int tt)
21 {
22 a = aa, b = bb, c = cc;
23 toward = tt;
24 }
25 STA()
26 {
27 toward = -1;
28 }
29 };
30
31 //4 ^ 3 = 64
32 bool use[70][70][70];
33 int ch[3][3];
34
35 vector<STA>sta;
36 vector<int>ans;
37
38 int turn(int x)
39 {
40 if(x == 12) return 0;
41 if(x == 3) return 1;
42 if(x == 6) return 2;
43 if(x == 9) return 3;
44 }
45
46 int makeState(int a, int b, int c)
47 {
48 a = turn(a);
49 b = turn(b);
50 c = turn(c);
51
52 return a + 4 * b + 16 * c;
53 }
54
55 void ready()
56 {
57 int beg[3];
58 for(int i = 0; i < 3; i++)
59 {
60 beg[i] = makeState(ch[i][0], ch[i][1], ch[i][2]);
61 }
62
63 sta.push_back(STA(beg[0], beg[1], beg[2]));
64 use[beg[0]][beg[1]][beg[2]] = true;
65 }
66
67 void make(int& num, int d)
68 {
69 int val[3];
70 val[0] = num % 4;
71 val[1] = (num / 4) % 4;
72 val[2] = num / 16;
73
74 val[d] = (val[d] + 1) % 4;
75 num = val[0] + 4 * val[1] + 16 * val[2];
76 }
77
78 void make(char ch, int& a, int& b, int& c)
79 {
80 switch(ch)
81 {
82 case 'A':
83 make(a, 0);
84 break;
85 case 'B':
86 make(a, 1);
87 break;
88 case 'C':
89 make(a, 2);
90 break;
91 case 'D':
92 make(b, 0);
93 break;
94 case 'E':
95 make(b, 1);
96 break;
97 case 'F':
98 make(b, 2);
99 break;
100 case 'G':
101 make(c, 0);
102 break;
103 case 'H':
104 make(c, 1);
105 break;
106 case 'I':
107 make(c, 2);
108 break;
109 }
110 }
111
112
113
114 STA operate(STA s, int j, int from)
115 {
116 int a, b, c;
117 a = s.a, b = s.b, c = s.c;
118
119 switch(j)
120 {
121 case 0:
122 make('A', a, b, c);
123 make('B', a, b, c);
124 make('D', a, b, c);
125 make('E', a, b, c);
126 break;
127 case 1:
128 make('A', a, b, c);
129 make('B', a, b, c);
130 make('C', a, b, c);
131 break;
132 case 2:
133 make('B', a, b, c);
134 make('C', a, b, c);
135 make('E', a, b, c);
136 make('F', a, b, c);
137 break;
138 case 3:
139 make('A', a, b, c);
140 make('D', a, b, c);
141 make('G', a, b, c);
142 break;
143 case 4:
144 make('B', a, b, c);
145 make('D', a, b, c);
146 make('E', a, b, c);
147 make('F', a, b, c);
148 make('H', a, b, c);
149 break;
150 case 5:
151 make('C', a, b, c);
152 make('F', a, b, c);
153 make('I', a, b, c);
154 break;
155 case 6:
156 make('D', a, b, c);
157 make('E', a, b, c);
158 make('G', a, b, c);
159 make('H', a, b, c);
160 break;
161 case 7:
162 make('G', a, b, c);
163 make('H', a, b, c);
164 make('I', a, b, c);
165 break;
166 case 8:
167 make('E', a, b, c);
168 make('F', a, b, c);
169 make('H', a, b, c);
170 make('I', a, b, c);
171 break;
172 }
173
174 STA res = STA(a, b, c, from);
175 res.op = j;
176 return res;
177 }
178
179 void check(STA s)
180 {
181 int a = s.a;
182 int b = s.b;
183 int c = s.c;
184
185 if(use[a][b][c] == false)
186 {
187 sta.push_back(s);
188 use[a][b][c] = true;
189 }
190 }
191
192 void go(int i)
193 {
194 if(sta[i].toward == -1) return;
195 go(sta[i].toward);
196 ans.push_back(sta[i].op + 1);
197 }
198
199 void bfs()
200 {
201 for(int i = 0; i < sta.size(); i++)
202 {
203 STA s = sta[i];
204 if(s.a == 0 && s.b == 0 && s.c == 0)
205 {
206 go(i);
207 for(int k = 0; k < ans.size(); k++)
208 {
209 if(k == 0) printf("%d", ans[k]);
210 else printf(" %d", ans[k]);
211 }
212 printf("\n");
213 return;
214 }
215
216 for(int j = 0; j < 9; j++)
217 {
218 check(operate(s, j, i));
219 }
220 }
221 }
222
223 int main()
224 {
225 freopen("clocks.in", "r", stdin);
226 freopen("clocks.out", "w", stdout);
227
228 for(int i = 0; i < 3; i++)
229 for(int j = 0; j < 3; j++)
230 scanf("%d", &ch[i][j]);
231 ready();
232 bfs();
233 }
原文地址:https://www.cnblogs.com/litstrong/p/1710487.html