BZOJ 1501 智慧珠游戏

Description

Input

文件中包含初始的盘件描述,一共有10行,第i行有i个字符。如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母。如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件。输入保证预放的零件已摆放在盘件中。

Output

如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局。其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件。如果无解,输出单独的一个字符串‘No solution’(不要引号,请注意大小写)。所有的数据保证最多只有一组解。

Sample Input

.
..
...
....
.....
.....C
...CCC.
EEEHH...
E.HHH....
E.........

Sample Output

B
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF

HINT

 

Source

暴搜+打表+卡时大法好,哈哈!!!这题老师居然把他当noip模拟题来考,也是醉了~考完后对着数据调也是一晚上和半上午的。。。

 

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 
  5 using namespace std;
  6 
  7 int s[15][15],times;
  8 int mod[15][10][10][2],have[15],num[15]={0,3,4,4,4,5,5,5,5,5,5,5,5};
  9 bool use[15];
 10 
 11 inline void finish()
 12 {
 13     for (int i = 1;i <= 10;++i)
 14     {
 15         for (int j = 1;j <= i;++j)
 16             printf("%c",s[i][j]+'A'-1);
 17         putchar('\n');
 18     }
 19 }
 20 
 21 inline bool okay(int a,int b,int x,int y)
 22 {
 23     int t = num[a],i;
 24     for (i = 1;i <= t;++i)
 25     {
 26         int tx = x + mod[a][b][i][0];
 27         int ty = y + mod[a][b][i][1];
 28         if (tx < 1 || tx > 10) return false;
 29         if (ty < 1 || ty > tx) return false;
 30         if (s[tx][ty] != 0) return false;
 31     }
 32     return true;
 33 }
 34 
 35 inline void give(int a,int b,int x,int y)
 36 {
 37     int t = num[a],i;
 38     for (i = 1;i <= t;++i)
 39     {
 40         int tx = x + mod[a][b][i][0];
 41         int ty = y + mod[a][b][i][1];
 42         s[tx][ty] = a;
 43     }
 44 }
 45 
 46 inline void ready()
 47 {
 48     have[1] = 4;
 49     mod[1][1][2][0] = 1; mod[1][1][2][1] = 0;
 50     mod[1][1][3][0] = 0; mod[1][1][3][1] = 1;
 51     //
 52     mod[1][2][2][0] = 0; mod[1][2][2][1] = -1;
 53     mod[1][2][3][0] = 1; mod[1][2][3][1] = 0;
 54     //
 55     mod[1][3][2][0] = 1; mod[1][3][2][1] = 0;
 56     mod[1][3][3][0] = 1; mod[1][3][3][1] = -1;
 57     //
 58     mod[1][4][2][0] = 1; mod[1][4][2][1] = 0;
 59     mod[1][4][3][0] = 1; mod[1][4][3][1] = 1;
 60 
 61     //////////////////////////////////////////////////
 62     have[2] = 2;
 63     mod[2][1][2][0] = 0; mod[2][1][2][1] = 1;
 64     mod[2][1][3][0] = 0; mod[2][1][3][1] = 2;
 65     mod[2][1][4][0] = 0; mod[2][1][4][1] = 3;
 66     //
 67     mod[2][2][2][0] = 1; mod[2][2][2][1] = 0;
 68     mod[2][2][3][0] = 2; mod[2][2][3][1] = 0;
 69     mod[2][2][4][0] = 3; mod[2][2][4][1] = 0;
 70 
 71     //////////////////////////////////////////////////
 72     have[3] = 8;
 73     mod[3][1][2][0] = 1; mod[3][1][2][1] = 0;
 74     mod[3][1][3][0] = 0; mod[3][1][3][1] = 1;
 75     mod[3][1][4][0] = 0; mod[3][1][4][1] = 2;
 76     //
 77     mod[3][2][2][0] = 0; mod[3][2][2][1] = 1;
 78     mod[3][2][3][0] = 1; mod[3][2][3][1] = 1;
 79     mod[3][2][4][0] = 2; mod[3][2][4][1] = 1;
 80     //
 81     mod[3][3][2][0] = 1; mod[3][3][2][1] = 0;
 82     mod[3][3][3][0] = 1; mod[3][3][3][1] = -1;
 83     mod[3][3][4][0] = 1; mod[3][3][4][1] = -2;
 84     //
 85     mod[3][4][2][0] = 1; mod[3][4][2][1] = 0;
 86     mod[3][4][3][0] = 2; mod[3][4][3][1] = 0;
 87     mod[3][4][4][0] = 2; mod[3][4][4][1] = 1;
 88     //
 89     mod[3][5][2][0] = 1; mod[3][5][2][1] = 0;
 90     mod[3][5][3][0] = 1; mod[3][5][3][1] = 1;
 91     mod[3][5][4][0] = 1; mod[3][5][4][1] = 2;
 92     //
 93     mod[3][6][2][0] = 0; mod[3][6][2][1] = 1;
 94     mod[3][6][3][0] = 1; mod[3][6][3][1] = 0;
 95     mod[3][6][4][0] = 2; mod[3][6][4][1] = 0;
 96     //
 97     mod[3][7][2][0] = 0; mod[3][7][2][1] = 1;
 98     mod[3][7][3][0] = 0; mod[3][7][3][1] = 2;
 99     mod[3][7][4][0] = 1; mod[3][7][4][1] = 2;
100     //
101     mod[3][8][2][0] = 1; mod[3][8][2][1] = 0;
102     mod[3][8][3][0] = 2; mod[3][8][3][1] = 0;
103     mod[3][8][4][0] = 2; mod[3][8][4][1] = -1;
104 
105     //////////////////////////////////////////////////
106     have[4] = 1;
107     mod[4][1][2][0] = 1; mod[4][1][2][1] = 0;
108     mod[4][1][3][0] = 0; mod[4][1][3][1] = 1;
109     mod[4][1][4][0] = 1; mod[4][1][4][1] = 1;
110 
111     ///////////////////////////////////////////////////
112     have[5] = 4;
113     mod[5][1][2][0] = 1; mod[5][1][2][1] = 0;
114     mod[5][1][3][0] = 2; mod[5][1][3][1] = 0;
115     mod[5][1][4][0] = 2; mod[5][1][4][1] = 1;
116     mod[5][1][5][0] = 2; mod[5][1][5][1] = 2;
117     //
118     mod[5][2][2][0] = 0; mod[5][2][2][1] = 1;
119     mod[5][2][3][0] = 0; mod[5][2][3][1] = 2;
120     mod[5][2][4][0] = 1; mod[5][2][4][1] = 0;
121     mod[5][2][5][0] = 2; mod[5][2][5][1] = 0;
122     //
123     mod[5][3][2][0] = 0; mod[5][3][2][1] = 1;
124     mod[5][3][3][0] = 0; mod[5][3][3][1] = 2;
125     mod[5][3][4][0] = 1; mod[5][3][4][1] = 2;
126     mod[5][3][5][0] = 2; mod[5][3][5][1] = 2;
127     //
128     mod[5][4][2][0] = 1; mod[5][4][2][1] = 0;
129     mod[5][4][3][0] = 2; mod[5][4][3][1] = 0;
130     mod[5][4][4][0] = 2; mod[5][4][4][1] = -1;
131     mod[5][4][5][0] = 2; mod[5][4][5][1] = -2;
132 
133     ////////////////////////////////////////////
134     have[6] = 8;
135     mod[6][1][2][0] = 0; mod[6][1][2][1] = 1;
136     mod[6][1][3][0] = 1; mod[6][1][3][1] = 1;
137     mod[6][1][4][0] = 0; mod[6][1][4][1] = 2;
138     mod[6][1][5][0] = 0; mod[6][1][5][1] = 3;
139     //
140     mod[6][2][2][0] = 1; mod[6][2][2][1] = 0;
141     mod[6][2][3][0] = 1; mod[6][2][3][1] = -1;
142     mod[6][2][4][0] = 2; mod[6][2][4][1] = 0;
143     mod[6][2][5][0] = 3; mod[6][2][5][1] = 0;
144     //
145     mod[6][3][2][0] = 1; mod[6][3][2][1] = 0;
146     mod[6][3][3][0] = 1; mod[6][3][3][1] = 1;
147     mod[6][3][4][0] = 1; mod[6][3][4][1] = -1;
148     mod[6][3][5][0] = 1; mod[6][3][5][1] = -2;
149     //
150     mod[6][4][2][0] = 1; mod[6][4][2][1] = 0;
151     mod[6][4][3][0] = 2; mod[6][4][3][1] = 0;
152     mod[6][4][4][0] = 2; mod[6][4][4][1] = 1;
153     mod[6][4][5][0] = 3; mod[6][4][5][1] = 0;
154     //
155     mod[6][5][2][0] = 1; mod[6][5][2][1] = 0;
156     mod[6][5][3][0] = 1; mod[6][5][3][1] = -1;
157     mod[6][5][4][0] = 1; mod[6][5][4][1] = 1;
158     mod[6][5][5][0] = 1; mod[6][5][5][1] = 2;
159     //
160     mod[6][6][2][0] = 1; mod[6][6][2][1] = 0;
161     mod[6][6][3][0] = 1; mod[6][6][3][1] = 1;
162     mod[6][6][4][0] = 2; mod[6][6][4][1] = 0;
163     mod[6][6][5][0] = 3; mod[6][6][5][1] = 0;
164     //
165     mod[6][7][2][0] = 0; mod[6][7][2][1] = -1;
166     mod[6][7][3][0] = 0; mod[6][7][3][1] = -2;
167     mod[6][7][4][0] = 0; mod[6][7][4][1] = 1;
168     mod[6][7][5][0] = 1; mod[6][7][5][1] = 0;
169     //
170     mod[6][8][2][0] = 1; mod[6][8][2][1] = 0;
171     mod[6][8][3][0] = 2; mod[6][8][3][1] = 0;
172     mod[6][8][4][0] = 2; mod[6][8][4][1] = -1;
173     mod[6][8][5][0] = 3; mod[6][8][5][1] = 0;
174 
175     ///////////////////////////////////////////////////////////
176     have[7] = 4;
177     mod[7][1][2][0] = 1; mod[7][1][2][1] = 0;
178     mod[7][1][3][0] = 0; mod[7][1][3][1] = 1;
179     mod[7][1][4][0] = 0; mod[7][1][4][1] = 2;
180     mod[7][1][5][0] = 1; mod[7][1][5][1] = 2;
181     //
182     mod[7][2][2][0] = 0; mod[7][2][2][1] = 1;
183     mod[7][2][3][0] = 1; mod[7][2][3][1] = 1;
184     mod[7][2][4][0] = 2; mod[7][2][4][1] = 1;
185     mod[7][2][5][0] = 2; mod[7][2][5][1] = 0;
186     //
187     mod[7][3][2][0] = 1; mod[7][3][2][1] = 0;
188     mod[7][3][3][0] = 1; mod[7][3][3][1] = 1;
189     mod[7][3][4][0] = 1; mod[7][3][4][1] = 2;
190     mod[7][3][5][0] = 0; mod[7][3][5][1] = 2;
191     //
192     mod[7][4][2][0] = 0; mod[7][4][2][1] = 1;
193     mod[7][4][3][0] = 1; mod[7][4][3][1] = 0;
194     mod[7][4][4][0] = 2; mod[7][4][4][1] = 0;
195     mod[7][4][5][0] = 2; mod[7][4][5][1] = 1;
196 
197     ////////////////////////////////////////////////////////////
198     have[8] = 8;
199     mod[8][1][2][0] = 1; mod[8][1][2][1] = 0;
200     mod[8][1][3][0] = 0; mod[8][1][3][1] = 1;
201     mod[8][1][4][0] = 1; mod[8][1][4][1] = 1;
202     mod[8][1][5][0] = 0; mod[8][1][5][1] = 2;
203     //
204     mod[8][2][2][0] = 0; mod[8][2][2][1] = 1;
205     mod[8][2][3][0] = 1; mod[8][2][3][1] = 0;
206     mod[8][2][4][0] = 1; mod[8][2][4][1] = 1;
207     mod[8][2][5][0] = 2; mod[8][2][5][1] = 1;
208     //
209     mod[8][3][2][0] = 0; mod[8][3][2][1] = 1;
210     mod[8][3][3][0] = 1; mod[8][3][3][1] = 0;
211     mod[8][3][4][0] = 1; mod[8][3][4][1] = 1;
212     mod[8][3][5][0] = 1; mod[8][3][5][1] = -1;
213     //
214     mod[8][4][2][0] = 1; mod[8][4][2][1] = 0;
215     mod[8][4][3][0] = 1; mod[8][4][3][1] = 1;
216     mod[8][4][4][0] = 2; mod[8][4][4][1] = 0;
217     mod[8][4][5][0] = 2; mod[8][4][5][1] = 1;
218     //
219     mod[8][5][2][0] = 1; mod[8][5][2][1] = 0;
220     mod[8][5][3][0] = 1; mod[8][5][3][1] = 1;
221     mod[8][5][4][0] = 0; mod[8][5][4][1] = 1;
222     mod[8][5][5][0] = 1; mod[8][5][5][1] = 2;
223     //
224     mod[8][6][2][0] = 1; mod[8][6][2][1] = 0;
225     mod[8][6][3][0] = 0; mod[8][6][3][1] = 1;
226     mod[8][6][4][0] = 1; mod[8][6][4][1] = 1;
227     mod[8][6][5][0] = 2; mod[8][6][5][1] = 0;
228     //
229     mod[8][7][2][0] = 0; mod[8][7][2][1] = 1;
230     mod[8][7][3][0] = 0; mod[8][7][3][1] = 2;
231     mod[8][7][4][0] = 1; mod[8][7][4][1] = 1;
232     mod[8][7][5][0] = 1; mod[8][7][5][1] = 2;
233     //
234     mod[8][8][2][0] = 1; mod[8][8][2][1] = 0;
235     mod[8][8][3][0] = 2; mod[8][8][3][1] = 0;
236     mod[8][8][4][0] = 1; mod[8][8][4][1] = -1;
237     mod[8][8][5][0] = 2; mod[8][8][5][1] = -1;
238 
239     /////////////////////////////////////////////
240     have[9] = 8;
241     mod[9][1][2][0] = 0; mod[9][1][2][1] = 1;
242     mod[9][1][3][0] = 0; mod[9][1][3][1] = 2;
243     mod[9][1][4][0] = 1; mod[9][1][4][1] = 2;
244     mod[9][1][5][0] = 1; mod[9][1][5][1] = 3;
245     //
246     mod[9][2][2][0] = 1; mod[9][2][2][1] = 0;
247     mod[9][2][3][0] = 2; mod[9][2][3][1] = 0;
248     mod[9][2][4][0] = 2; mod[9][2][4][1] = -1;
249     mod[9][2][5][0] = 3; mod[9][2][5][1] = -1;
250     //
251     mod[9][3][2][0] = 0; mod[9][3][2][1] = 1;
252     mod[9][3][3][0] = 1; mod[9][3][3][1] = 1;
253     mod[9][3][4][0] = 1; mod[9][3][4][1] = 2;
254     mod[9][3][5][0] = 1; mod[9][3][5][1] = 3;
255     //
256     mod[9][4][2][0] = 1; mod[9][4][2][1] = 0;
257     mod[9][4][3][0] = 1; mod[9][4][3][1] = -1;
258     mod[9][4][4][0] = 2; mod[9][4][4][1] = -1;
259     mod[9][4][5][0] = 3; mod[9][4][5][1] = -1;
260     //
261     mod[9][5][2][0] = 0; mod[9][5][2][1] = 1;
262     mod[9][5][3][0] = 1; mod[9][5][3][1] = 0;
263     mod[9][5][4][0] = 1; mod[9][5][4][1] = -1;
264     mod[9][5][5][0] = 1; mod[9][5][5][1] = -2;
265     //
266     mod[9][6][2][0] = 1; mod[9][6][2][1] = 0;
267     mod[9][6][3][0] = 2; mod[9][6][3][1] = 0;
268     mod[9][6][4][0] = 2; mod[9][6][4][1] = 1;
269     mod[9][6][5][0] = 3; mod[9][6][5][1] = 1;
270     //
271     mod[9][7][2][0] = 0; mod[9][7][2][1] = 1;
272     mod[9][7][3][0] = 0; mod[9][7][3][1] = 2;
273     mod[9][7][4][0] = 1; mod[9][7][4][1] = 0;
274     mod[9][7][5][0] = 1; mod[9][7][5][1] = -1;
275     //
276     mod[9][8][2][0] = 1; mod[9][8][2][1] = 0;
277     mod[9][8][3][0] = 1; mod[9][8][3][1] = 1;
278     mod[9][8][4][0] = 2; mod[9][8][4][1] = 1;
279     mod[9][8][5][0] = 3; mod[9][8][5][1] = 1;
280 
281     ////////////////////////////////////////////////////////////
282     have[10] = 1;
283     mod[10][1][2][0] = 1; mod[10][1][2][1] = 0;
284     mod[10][1][3][0] = 1; mod[10][1][3][1] = -1;
285     mod[10][1][4][0] = 1; mod[10][1][4][1] = 1;
286     mod[10][1][5][0] = 2; mod[10][1][5][1] = 0;
287 
288     ////////////////////////////////////////////////////////////
289     have[11] = 4;
290     mod[11][1][2][0] = 1; mod[11][1][2][1] = 0;
291     mod[11][1][3][0] = 1; mod[11][1][3][1] = 1;
292     mod[11][1][4][0] = 2; mod[11][1][4][1] = 1;
293     mod[11][1][5][0] = 2; mod[11][1][5][1] = 2;
294     //
295     mod[11][2][2][0] = 0; mod[11][2][2][1] = 1;
296     mod[11][2][3][0] = 1; mod[11][2][3][1] = 0;
297     mod[11][2][4][0] = 1; mod[11][2][4][1] = -1;
298     mod[11][2][5][0] = 2; mod[11][2][5][1] = -1;
299     //
300     mod[11][3][2][0] = 0; mod[11][3][2][1] = 1;
301     mod[11][3][3][0] = 1; mod[11][3][3][1] = 1;
302     mod[11][3][4][0] = 1; mod[11][3][4][1] = 2;
303     mod[11][3][5][0] = 2; mod[11][3][5][1] = 2;
304     //
305     mod[11][4][2][0] = 1; mod[11][4][2][1] = 0;
306     mod[11][4][3][0] = 1; mod[11][4][3][1] = -1;
307     mod[11][4][4][0] = 2; mod[11][4][4][1] = -1;
308     mod[11][4][5][0] = 2; mod[11][4][5][1] = -2;
309 
310     /////////////////////////////////////////////////////////
311     have[12] = 8;
312     mod[12][1][2][0] = 1; mod[12][1][2][1] = 0;
313     mod[12][1][3][0] = 0; mod[12][1][3][1] = 1;
314     mod[12][1][4][0] = 0; mod[12][1][4][1] = 2;
315     mod[12][1][5][0] = 0; mod[12][1][5][1] = 3;
316     //
317     mod[12][2][2][0] = 0; mod[12][2][2][1] = 1;
318     mod[12][2][3][0] = 1; mod[12][2][3][1] = 1;
319     mod[12][2][4][0] = 2; mod[12][2][4][1] = 1;
320     mod[12][2][5][0] = 3; mod[12][2][5][1] = 1;
321     //
322     mod[12][3][2][0] = 1; mod[12][3][2][1] = 0;
323     mod[12][3][3][0] = 1; mod[12][3][3][1] = -1;
324     mod[12][3][4][0] = 1; mod[12][3][4][1] = -2;
325     mod[12][3][5][0] = 1; mod[12][3][5][1] = -3;
326     //
327     mod[12][4][2][0] = 1; mod[12][4][2][1] = 0;
328     mod[12][4][3][0] = 2; mod[12][4][3][1] = 0;
329     mod[12][4][4][0] = 3; mod[12][4][4][1] = 0;
330     mod[12][4][5][0] = 3; mod[12][4][5][1] = 1;
331     //
332     mod[12][5][2][0] = 1; mod[12][5][2][1] = 0;
333     mod[12][5][3][0] = 1; mod[12][5][3][1] = 1;
334     mod[12][5][4][0] = 1; mod[12][5][4][1] = 2;
335     mod[12][5][5][0] = 1; mod[12][5][5][1] = 3;
336     //
337     mod[12][6][2][0] = 1; mod[12][6][2][1] = 0;
338     mod[12][6][3][0] = 2; mod[12][6][3][1] = 0;
339     mod[12][6][4][0] = 3; mod[12][6][4][1] = 0;
340     mod[12][6][5][0] = 0; mod[12][6][5][1] = 1;
341     //
342     mod[12][7][2][0] = 0; mod[12][7][2][1] = 1;
343     mod[12][7][3][0] = 0; mod[12][7][3][1] = 2;
344     mod[12][7][4][0] = 0; mod[12][7][4][1] = 3;
345     mod[12][7][5][0] = 1; mod[12][7][5][1] = 3;
346     //
347     mod[12][8][2][0] = 1; mod[12][8][2][1] = 0;
348     mod[12][8][3][0] = 2; mod[12][8][3][1] = 0;
349     mod[12][8][4][0] = 3; mod[12][8][4][1] = 0;
350     mod[12][8][5][0] = 3; mod[12][8][5][1] = -1;
351 }
352 
353 inline void next(int,int);
354 
355 inline void dfs(int,int);
356 
357 inline void att(int,int);
358 
359 int main()
360 {
361     freopen("1501.in","r",stdin);
362     freopen("1501.out","w",stdout);
363     for (int i = 1;i <= 10;++i)
364     {
365         for (int j = 1;j <= i;++j)
366         {
367             char c= getchar();
368             if (c == '.') s[i][j] = 0;
369             else s[i][j] = c-'A'+1,use[c-'A'+1] = true;
370         }
371         getchar();
372     }
373     ready();
374     dfs(1,1);
375     printf("No solution");
376     fclose(stdin); fclose(stdout);
377     return 0;
378 }
379 
380 inline void next(int x,int y)
381 {
382     if (y == x)
383         dfs(x+1,1);
384     else dfs(x,y+1);
385 }
386 
387 inline void dfs(int x,int y)
388 {
389     if (x > 10)
390     {
391         finish(),exit(0);
392         return;
393     }
394     if (times > 5000000) return;
395     times++;
396     if (s[x][y] == 0)
397         att(x,y);
398     else next(x,y);
399 }
400 
401 inline void att(int x,int y)
402 {
403     int temp[15][15];
404     memcpy(temp,s,sizeof(temp));
405     int i,j;
406     for (i = 12;i>=1;--i)
407     {
408         if (use[i]) continue;
409         for (j = 1;j <= have[i];++j)
410             if (okay(i,j,x,y))
411             {
412                 use[i] = true;
413                 give(i,j,x,y);
414                 next(x,y);
415                 memcpy(s,temp,sizeof(s));
416                 use[i] = false;
417             }
418     }
419 }
View Code

 

posted @ 2015-02-16 20:01  lmxyy  阅读(387)  评论(4编辑  收藏  举报