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.........
..
...
....
.....
.....C
...CCC.
EEEHH...
E.HHH....
E.........
Sample Output
B
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF
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 }
高考结束,重新回归。