题目描述
智慧珠游戏 【问题描述】 智慧珠游戏拼盘由一个三角形盘件和 12 个形态各异的零件组成。拼盘的盘 件如图 1 所示: 图1 12 个零件按珠子数分 3 大类: 第 1 大类,有三个珠子,只有一种形状。 符号为 A,形状为 第 2 大类,有 4 个珠子,有 3 种形状。 符号为 B,形状为 符号为 C,形状为 符号为 D,形状为 第 3 大类,有 5 个珠子,有 8 种形状。 符号为 E,形状为 符号为 F,形状为 符号为 G,形状为 符号为 H,形状为 符号为 I,形状为 符号为 J,形状为 符号为 K,形状为 符号为 L,形状为 图2 图 2 示出了一种拼盘方案。为便于描述可将图 2 抽象为图 3,就可以用一个 数据为字符的二维数组来表示了。 B B K B K K B J K K J J J D D G J G D D C G G G C C C I E E E H H I I A E L H H H I A A F E L L L L I F F F F 图3 对于由珠子构成的零件,可以放到盘件的任一位置,条件是能有地方放,且 尺寸合适,所有的零件都允许旋转(0o、90o、180o、270o)和翻转(水平、竖直)。 现给出一个盘件的初始布局,求一种可行的智慧珠摆放方案,使所有的零件 都能放进盘件中。 【输入格式】 文件中包含初始的盘件描述,一共有 10 行,第 i 行有 i 个字符。如果第 i 行 的第 j 个字符是字母”A”至”L”中的一个,则表示第 i 行第 j 列的格子上已经放了 零件,零件的编号为对应的字母。如果第 i 行的第 j 个字符是”.”,则表示第 i 行 第 j 列的格子上没有放零件。 输入保证预放的零件已摆放在盘件中。 【输出格式】 如果能找到解,向输出文件打印 10 行,为放完全部 12 个零件后的布局。其 中,第 i 行应包含 i 个字符,第 i 行的第 j 个字符表示第 i 行第 j 列的格子上放的 是哪个零件。 如果无解,输出单独的一个字符串‘No solution’(不要引号,请注意大小写)。 所有的数据保证最多只有一组解。 【输入样例】 . .. ... .... ..... .....C ...CCC. EEEHH... E.HHH.... E......... 【输出样例】 B BK BKK BJKK JJJDD GJGDDC GGGCCCI EEEHHIIA ELHHHIAAF ELLLLIFFFF
My code
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.