1 (*
2 *Problem: NOI2005 智慧珠游戏
3 *Author : Chen Yang
4 *Time : 2012.6.3 5:40 pm
5 *State : solved
6 *Memo : 搜索、预处理
7 *)
8 program zhzyx;
9 var
10 i,j:longint;
11 map,text:array[0..15,0..15] of char;
12 get:array['A'..'Z'] of boolean;
13 have:array[0..15,0..15] of boolean;
14 F:array['A'..'Z',0..8,0..5,0..2] of longint;
15 S,P:array['A'..'Z'] of longint;
16 //======================
17 procedure init;
18 begin
19 S['A']:=4; P['A']:=2;
20 F['A',1,1,1]:=0; F['A',1,1,2]:=1;
21 F['A',1,2,1]:=1; F['A',1,2,2]:=0;
22
23 F['A',2,1,1]:=0; F['A',2,1,2]:=1;
24 F['A',2,2,1]:=1; F['A',2,2,2]:=1;
25
26 F['A',3,1,1]:=1; F['A',3,1,2]:=0;
27 F['A',3,2,1]:=1; F['A',3,2,2]:=1;
28
29 F['A',4,1,1]:=1; F['A',4,1,2]:=0;
30 F['A',4,2,1]:=1; F['A',4,2,2]:=-1;
31
32 S['B']:=2; P['B']:=3;
33 F['B',1,1,1]:=0; F['B',1,1,2]:=1;
34 F['B',1,2,1]:=0; F['B',1,2,2]:=2;
35 F['B',1,3,1]:=0; F['B',1,3,2]:=3;
36
37 F['B',2,1,1]:=1; F['B',2,1,2]:=0;
38 F['B',2,2,1]:=2; F['B',2,2,2]:=0;
39 F['B',2,3,1]:=3; F['B',2,3,2]:=0;
40
41 S['C']:=8; P['C']:=3;
42 F['C',1,1,1]:=1; F['C',1,1,2]:=0;
43 F['C',1,2,1]:=2; F['C',1,2,2]:=0;
44 F['C',1,3,1]:=2; F['C',1,3,2]:=-1;
45
46 F['C',2,1,1]:=0; F['C',2,1,2]:=1;
47 F['C',2,2,1]:=1; F['C',2,2,2]:=1;
48 F['C',2,3,1]:=2; F['C',2,3,2]:=1;
49
50 F['C',3,1,1]:=1; F['C',3,1,2]:=0;
51 F['C',3,2,1]:=2; F['C',3,2,2]:=0;
52 F['C',3,3,1]:=2; F['C',3,3,2]:=1;
53
54 F['C',4,1,1]:=0; F['C',4,1,2]:=1;
55 F['C',4,2,1]:=1; F['C',4,2,2]:=0;
56 F['C',4,3,1]:=2; F['C',4,3,2]:=0;
57
58 F['C',5,1,1]:=1; F['C',5,1,2]:=0;
59 F['C',5,2,1]:=1; F['C',5,2,2]:=-1;
60 F['C',5,3,1]:=1; F['C',5,3,2]:=-2;
61
62 F['C',6,1,1]:=1; F['C',6,1,2]:=0;
63 F['C',6,2,1]:=1; F['C',6,2,2]:=1;
64 F['C',6,3,1]:=1; F['C',6,3,2]:=2;
65
66 F['C',7,1,1]:=0; F['C',7,1,2]:=1;
67 F['C',7,2,1]:=0; F['C',7,2,2]:=2;
68 F['C',7,3,1]:=1; F['C',7,3,2]:=2;
69
70 F['C',8,1,1]:=1; F['C',8,1,2]:=0;
71 F['C',8,2,1]:=0; F['C',8,2,2]:=1;
72 F['C',8,3,1]:=0; F['C',8,3,2]:=2;
73
74 S['D']:=1; P['D']:=3;
75 F['D',1,1,1]:=1; F['D',1,1,2]:=0;
76 F['D',1,2,1]:=0; F['D',1,2,2]:=1;
77 F['D',1,3,1]:=1; F['D',1,3,2]:=1;
78
79 S['E']:=4; P['E']:=4;
80 F['E',1,1,1]:=1; F['E',1,1,2]:=0;
81 F['E',1,2,1]:=2; F['E',1,2,2]:=0;
82 F['E',1,3,1]:=2; F['E',1,3,2]:=1;
83 F['E',1,4,1]:=2; F['E',1,4,2]:=2;
84
85 F['E',2,1,1]:=1; F['E',2,1,2]:=0;
86 F['E',2,2,1]:=2; F['E',2,2,2]:=0;
87 F['E',2,3,1]:=2; F['E',2,3,2]:=-1;
88 F['E',2,4,1]:=2; F['E',2,4,2]:=-2;
89
90 F['E',3,1,1]:=0; F['E',3,1,2]:=1;
91 F['E',3,2,1]:=0; F['E',3,2,2]:=2;
92 F['E',3,3,1]:=1; F['E',3,3,2]:=0;
93 F['E',3,4,1]:=2; F['E',3,4,2]:=0;
94
95 F['E',4,1,1]:=0; F['E',4,1,2]:=1;
96 F['E',4,2,1]:=0; F['E',4,2,2]:=2;
97 F['E',4,3,1]:=1; F['E',4,3,2]:=2;
98 F['E',4,4,1]:=2; F['E',4,4,2]:=2;
99
100 S['F']:=8; P['F']:=4;
101 F['F',1,1,1]:=0; F['F',1,1,2]:=1;
102 F['F',1,2,1]:=1; F['F',1,2,2]:=1;
103 F['F',1,3,1]:=0; F['F',1,3,2]:=2;
104 F['F',1,4,1]:=0; F['F',1,4,2]:=3;
105
106 F['F',2,1,1]:=1; F['F',2,1,2]:=0;
107 F['F',2,2,1]:=1; F['F',2,2,2]:=-1;
108 F['F',2,3,1]:=1; F['F',2,3,2]:=1;
109 F['F',2,4,1]:=1; F['F',2,4,2]:=2;
110
111 F['F',3,1,1]:=1; F['F',3,1,2]:=0;
112 F['F',3,2,1]:=2; F['F',3,2,2]:=0;
113 F['F',3,3,1]:=1; F['F',3,3,2]:=-1;
114 F['F',3,4,1]:=3; F['F',3,4,2]:=0;
115
116 F['F',4,1,1]:=1; F['F',4,1,2]:=0;
117 F['F',4,2,1]:=2; F['F',4,2,2]:=0;
118 F['F',4,3,1]:=1; F['F',4,3,2]:=1;
119 F['F',4,4,1]:=3; F['F',4,4,2]:=0;
120
121 F['F',5,1,1]:=1; F['F',5,1,2]:=0;
122 F['F',5,2,1]:=2; F['F',5,2,2]:=0;
123 F['F',5,3,1]:=3; F['F',5,3,2]:=0;
124 F['F',5,4,1]:=2; F['F',5,4,2]:=1;
125
126 F['F',6,1,1]:=1; F['F',6,1,2]:=0;
127 F['F',6,2,1]:=2; F['F',6,2,2]:=0;
128 F['F',6,3,1]:=3; F['F',6,3,2]:=0;
129 F['F',6,4,1]:=2; F['F',6,4,2]:=-1;
130
131 F['F',7,1,1]:=1; F['F',7,1,2]:=1;
132 F['F',7,2,1]:=1; F['F',7,2,2]:=0;
133 F['F',7,3,1]:=1; F['F',7,3,2]:=-1;
134 F['F',7,4,1]:=1; F['F',7,4,2]:=-2;
135
136 F['F',8,1,1]:=0; F['F',8,1,2]:=1;
137 F['F',8,2,1]:=0; F['F',8,2,2]:=2;
138 F['F',8,3,1]:=0; F['F',8,3,2]:=3;
139 F['F',8,4,1]:=1; F['F',8,4,2]:=2;
140
141 S['G']:=4; P['G']:=4;
142 F['G',1,1,1]:=1; F['G',1,1,2]:=0;
143 F['G',1,2,1]:=0; F['G',1,2,2]:=1;
144 F['G',1,3,1]:=0; F['G',1,3,2]:=2;
145 F['G',1,4,1]:=1; F['G',1,4,2]:=2;
146
147 F['G',2,1,1]:=1; F['G',2,1,2]:=0;
148 F['G',2,2,1]:=1; F['G',2,2,2]:=1;
149 F['G',2,3,1]:=1; F['G',2,3,2]:=2;
150 F['G',2,4,1]:=0; F['G',2,4,2]:=2;
151
152 F['G',3,1,1]:=0; F['G',3,1,2]:=1;
153 F['G',3,2,1]:=1; F['G',3,2,2]:=1;
154 F['G',3,3,1]:=2; F['G',3,3,2]:=1;
155 F['G',3,4,1]:=2; F['G',3,4,2]:=0;
156
157 F['G',4,1,1]:=0; F['G',4,1,2]:=1;
158 F['G',4,2,1]:=1; F['G',4,2,2]:=0;
159 F['G',4,3,1]:=2; F['G',4,3,2]:=0;
160 F['G',4,4,1]:=2; F['G',4,4,2]:=1;
161
162 S['H']:=8; P['H']:=4;
163 F['H',1,1,1]:=0; F['H',1,1,2]:=1;
164 F['H',1,2,1]:=0; F['H',1,2,2]:=2;
165 F['H',1,3,1]:=1; F['H',1,3,2]:=0;
166 F['H',1,4,1]:=1; F['H',1,4,2]:=1;
167
168 F['H',2,1,1]:=0; F['H',2,1,2]:=1;
169 F['H',2,2,1]:=0; F['H',2,2,2]:=2;
170 F['H',2,3,1]:=1; F['H',2,3,2]:=1;
171 F['H',2,4,1]:=1; F['H',2,4,2]:=2;
172
173 F['H',3,1,1]:=1; F['H',3,1,2]:=0;
174 F['H',3,2,1]:=1; F['H',3,2,2]:=-1;
175 F['H',3,3,1]:=2; F['H',3,3,2]:=0;
176 F['H',3,4,1]:=2; F['H',3,4,2]:=-1;
177
178 F['H',4,1,1]:=1; F['H',4,1,2]:=0;
179 F['H',4,2,1]:=1; F['H',4,2,2]:=1;
180 F['H',4,3,1]:=2; F['H',4,3,2]:=0;
181 F['H',4,4,1]:=2; F['H',4,4,2]:=1;
182
183 F['H',5,1,1]:=0; F['H',5,1,2]:=1;
184 F['H',5,2,1]:=1; F['H',5,2,2]:=0;
185 F['H',5,3,1]:=1; F['H',5,3,2]:=1;
186 F['H',5,4,1]:=1; F['H',5,4,2]:=2;
187
188 F['H',6,1,1]:=0; F['H',6,1,2]:=1;
189 F['H',6,2,1]:=1; F['H',6,2,2]:=0;
190 F['H',6,3,1]:=1; F['H',6,3,2]:=1;
191 F['H',6,4,1]:=2; F['H',6,4,2]:=1;
192
193 F['H',7,1,1]:=0; F['H',7,1,2]:=1;
194 F['H',7,2,1]:=1; F['H',7,2,2]:=0;
195 F['H',7,3,1]:=1; F['H',7,3,2]:=1;
196 F['H',7,4,1]:=1; F['H',7,4,2]:=-1;
197
198 F['H',8,1,1]:=0; F['H',8,1,2]:=1;
199 F['H',8,2,1]:=1; F['H',8,2,2]:=0;
200 F['H',8,3,1]:=1; F['H',8,3,2]:=1;
201 F['H',8,4,1]:=2; F['H',8,4,2]:=0;
202
203 S['I']:=8; P['I']:=4;
204 F['I',1,1,1]:=0; F['I',1,1,2]:=1;
205 F['I',1,2,1]:=0; F['I',1,2,2]:=2;
206 F['I',1,3,1]:=1; F['I',1,3,2]:=2;
207 F['I',1,4,1]:=1; F['I',1,4,2]:=3;
208
209 F['I',2,1,1]:=0; F['I',2,1,2]:=1;
210 F['I',2,2,1]:=1; F['I',2,2,2]:=0;
211 F['I',2,3,1]:=1; F['I',2,3,2]:=-1;
212 F['I',2,4,1]:=1; F['I',2,4,2]:=-2;
213
214 F['I',3,1,1]:=0; F['I',3,1,2]:=1;
215 F['I',3,2,1]:=0; F['I',3,2,2]:=2;
216 F['I',3,3,1]:=1; F['I',3,3,2]:=0;
217 F['I',3,4,1]:=1; F['I',3,4,2]:=-1;
218
219 F['I',4,1,1]:=0; F['I',4,1,2]:=1;
220 F['I',4,2,1]:=1; F['I',4,2,2]:=1;
221 F['I',4,3,1]:=1; F['I',4,3,2]:=2;
222 F['I',4,4,1]:=1; F['I',4,4,2]:=3;
223
224 F['I',5,1,1]:=1; F['I',5,1,2]:=0;
225 F['I',5,2,1]:=1; F['I',5,2,2]:=1;
226 F['I',5,3,1]:=2; F['I',5,3,2]:=1;
227 F['I',5,4,1]:=3; F['I',5,4,2]:=1;
228
229 F['I',6,1,1]:=1; F['I',6,1,2]:=0;
230 F['I',6,2,1]:=1; F['I',6,2,2]:=-1;
231 F['I',6,3,1]:=2; F['I',6,3,2]:=-1;
232 F['I',6,4,1]:=3; F['I',6,4,2]:=-1;
233
234 F['I',7,1,1]:=1; F['I',7,1,2]:=0;
235 F['I',7,2,1]:=2; F['I',7,2,2]:=0;
236 F['I',7,3,1]:=2; F['I',7,3,2]:=1;
237 F['I',7,4,1]:=3; F['I',7,4,2]:=1;
238
239 F['I',8,1,1]:=1; F['I',8,1,2]:=0;
240 F['I',8,2,1]:=2; F['I',8,2,2]:=0;
241 F['I',8,3,1]:=2; F['I',8,3,2]:=-1;
242 F['I',8,4,1]:=3; F['I',8,4,2]:=-1;
243
244 S['J']:=1; P['J']:=4;
245 F['J',1,1,1]:=1; F['J',1,1,2]:=0;
246 F['J',1,2,1]:=1; F['J',1,2,2]:=1;
247 F['J',1,3,1]:=2; F['J',1,3,2]:=0;
248 F['J',1,4,1]:=1; F['J',1,4,2]:=-1;
249
250 S['K']:=4; P['K']:=4;
251 F['K',1,1,1]:=1; F['K',1,1,2]:=0;
252 F['K',1,2,1]:=1; F['K',1,2,2]:=1;
253 F['K',1,3,1]:=2; F['K',1,3,2]:=1;
254 F['K',1,4,1]:=2; F['K',1,4,2]:=2;
255
256 F['K',2,1,1]:=1; F['K',2,1,2]:=0;
257 F['K',2,2,1]:=1; F['K',2,2,2]:=-1;
258 F['K',2,3,1]:=2; F['K',2,3,2]:=-1;
259 F['K',2,4,1]:=2; F['K',2,4,2]:=-2;
260
261 F['K',3,1,1]:=0; F['K',3,1,2]:=1;
262 F['K',3,2,1]:=1; F['K',3,2,2]:=1;
263 F['K',3,3,1]:=1; F['K',3,3,2]:=2;
264 F['K',3,4,1]:=2; F['K',3,4,2]:=2;
265
266 F['K',4,1,1]:=0; F['K',4,1,2]:=1;
267 F['K',4,2,1]:=1; F['K',4,2,2]:=0;
268 F['K',4,3,1]:=1; F['K',4,3,2]:=-1;
269 F['K',4,4,1]:=2; F['K',4,4,2]:=-1;
270
271 S['L']:=8; P['L']:=4;
272 F['L',1,1,1]:=0; F['L',1,1,2]:=1;
273 F['L',1,2,1]:=0; F['L',1,2,2]:=2;
274 F['L',1,3,1]:=0; F['L',1,3,2]:=3;
275 F['L',1,4,1]:=1; F['L',1,4,2]:=0;
276
277 F['L',2,1,1]:=1; F['L',2,1,2]:=0;
278 F['L',2,2,1]:=1; F['L',2,2,2]:=1;
279 F['L',2,3,1]:=1; F['L',2,3,2]:=2;
280 F['L',2,4,1]:=1; F['L',2,4,2]:=3;
281
282 F['L',3,1,1]:=0; F['L',3,1,2]:=1;
283 F['L',3,2,1]:=0; F['L',3,2,2]:=2;
284 F['L',3,3,1]:=0; F['L',3,3,2]:=3;
285 F['L',3,4,1]:=1; F['L',3,4,2]:=3;
286
287 F['L',4,1,1]:=1; F['L',4,1,2]:=0;
288 F['L',4,2,1]:=1; F['L',4,2,2]:=-1;
289 F['L',4,3,1]:=1; F['L',4,3,2]:=-2;
290 F['L',4,4,1]:=1; F['L',4,4,2]:=-3;
291
292 F['L',5,1,1]:=1; F['L',5,1,2]:=0;
293 F['L',5,2,1]:=2; F['L',5,2,2]:=0;
294 F['L',5,3,1]:=3; F['L',5,3,2]:=0;
295 F['L',5,4,1]:=3; F['L',5,4,2]:=1;
296
297 F['L',6,1,1]:=0; F['L',6,1,2]:=1;
298 F['L',6,2,1]:=1; F['L',6,2,2]:=0;
299 F['L',6,3,1]:=2; F['L',6,3,2]:=0;
300 F['L',6,4,1]:=3; F['L',6,4,2]:=0;
301
302 F['L',7,1,1]:=1; F['L',7,1,2]:=0;
303 F['L',7,2,1]:=2; F['L',7,2,2]:=0;
304 F['L',7,3,1]:=3; F['L',7,3,2]:=0;
305 F['L',7,4,1]:=3; F['L',7,4,2]:=-1;
306
307 F['L',8,1,1]:=0; F['L',8,1,2]:=1;
308 F['L',8,2,1]:=1; F['L',8,2,2]:=1;
309 F['L',8,3,1]:=2; F['L',8,3,2]:=1;
310 F['L',8,4,1]:=3; F['L',8,4,2]:=1;
311 end;
312 //======================
313 procedure print;
314 var
315 i,j:longint;
316 begin
317 for i:=1 to 10 do
318 begin
319 for j:=1 to i do write(map[i,j]);
320 writeln;
321 end;
322 end;
323 //======================
324 function check(x,y,k:longint; fp:char):boolean;
325 var
326 i,fx,fy:longint;
327 begin
328 for i:=1 to p[fp] do
329 begin
330 fx:=x+f[fp,k,i,1]; fy:=y+f[fp,k,i,2];
331 if (fx<1)or(fx>10)or(fy<1)or(fy>fx)or(map[fx,fy]<>'.') then exit(false);
332 end;
333 exit(true);
334 end;
335 //======================
336 procedure change(x,y,k:longint; fp,q:char);
337 var
338 i,fx,fy:longint;
339 begin
340 for i:=1 to p[fp] do
341 begin
342 fx:=x+f[fp,k,i,1]; fy:=y+f[fp,k,i,2];
343 map[fx,fy]:=q;
344 end;
345 end;
346 //======================
347 procedure find(x,y:longint);
348 var
349 fx,fy,i:longint;
350 fp:char;
351 begin
352 if x=11 then
353 begin
354 print;
355 close(input); close(output);
356 halt;
357 end;
358 fx:=x; fy:=y+1;
359 if fy>fx then
360 begin
361 inc(fx); fy:=1;
362 end;
363 if map[x,y]<>'.' then find(fx,fy) else
364 for fp:='A' to 'L' do
365 if not get[fp] then
366 begin
367 get[fp]:=true; map[x,y]:=fp;
368 for i:=1 to s[fp] do
369 if check(x,y,i,fp) then
370 begin
371 change(x,y,i,fp,fp);
372 find(fx,fy);
373 change(x,y,i,fp,'.');
374 end;
375 map[x,y]:='.'; get[fp]:=false;
376 end;
377 end;
378 //======================
379 procedure check;
380 var
381 i,j,k,x,y,fx,fy:longint;
382 fp:char;
383 begin
384 for fp:='A' to 'L' do
385 begin
386 writeln(fp);
387 for i:=1 to s[fp] do
388 begin
389 for j:=1 to 10 do
390 for k:=1 to 10 do text[j,k]:='.';
391 x:=5; y:=5; text[x,y]:='S';
392 for j:=1 to p[fp] do
393 begin
394 fx:=x+f[fp,i,j,1]; fy:=y+f[fp,i,j,2];
395 text[fx,fy]:='*';
396 end;
397 for j:=1 to 10 do
398 begin
399 for k:=1 to 10 do write(text[j,k]);
400 writeln;
401 end;
402 writeln;
403 end;
404 end;
405 end;
406 //======================
407 procedure work(x,y,s:longint);
408 var
409 next:boolean;
410 begin
411 have[x,y]:=true;
412 next:=false;
413 if (map[x+1,y]='.')and not have[x+1,y] then
414 begin work(x+1,y,s+1); next:=true; end;
415 if (map[x-1,y]='.')and not have[x-1,y] then
416 begin work(x-1,y,s+1); next:=true; end;
417 if (map[x,y+1]='.')and not have[x,y+1] then
418 begin work(x,y+1,s+1); next:=true; end;
419 if (map[x,y-1]='.')and not have[x,y-1] then
420 begin work(x,y-1,s+1); next:=true; end;
421 if not next and (s<3) then
422 begin
423 writeln('No solution');
424 close(input); close(output);
425 halt;
426 end;
427 end;
428 //======================
429 begin
430 assign(input,'zhzyx.in'); reset(input);
431 assign(output,'zhzyx.out'); rewrite(output);
432 for i:=1 to 10 do
433 begin
434 for j:=1 to i do
435 begin
436 read(map[i,j]);
437 if map[i,j] in ['A'..'Z'] then get[map[i,j]]:=true;
438 end;
439 readln;
440 end;
441 init;
442 //check;
443 for i:=1 to 10 do
444 begin
445 for j:=1 to i do
446 if not have[i,j] and (map[i,j]='.') then work(i,j,1);
447 end;
448 find(1,1);
449 writeln('No solution');
450 close(input); close(output);
451 end.