1972: [Sdoi2010]猪国杀 - BZOJ
题目太长,我只发链接吧
wikioi(排版看起来舒服一点):http://www.wikioi.com/problem/1834/
bzoj:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1972
首先是题目的样例错了,第三个人有6个J
还有,数据有问题,第1,2个点牌不够用,抽完了就一直抽最后一张牌
调了一天多,我的模拟能力真TM差啊
犯了几个傻逼错误
1.让死人(反贼)继续出牌,用南蛮入侵杀死队友,导致主公获胜
2.主公杀死忠臣没有弃装备,后来用诸葛连杀掉反贼获胜
3.最烦的就是无懈可击的顺序了,先从出锦囊的人开始逆时针献殷勤,如果被无懈可击了,就回到上一个献殷勤的人的下家开始献殷勤(一开始直接往后,点都是交替错的(A对B就错),就是没有全对)
1 type 2 aa=array[0..2010]of char; 3 pig=record 4 pai:aa; 5 blood,num:longint; 6 zhuge,tiaozhong,tiaofan,leifan,sha:boolean; 7 shenfen:char; 8 end; 9 var 10 a:array[0..10]of pig; 11 p:array[0..2010]of char; 12 n,m,now,fanzeishu:longint; 13 14 procedure print; 15 var 16 i,j:longint; 17 begin 18 for i:=1 to n do 19 with a[i] do 20 begin 21 if blood>0 then 22 begin 23 for j:=1 to num do 24 if j<num then write(pai[j],' ') 25 else write(pai[j]); 26 end 27 else write('DEAD'); 28 writeln; 29 end; 30 halt; 31 end; 32 33 procedure MPwin; 34 begin 35 writeln('MP'); 36 print; 37 end; 38 39 procedure FPwin; 40 begin 41 writeln('FP'); 42 print; 43 end; 44 45 procedure init; 46 var 47 i,j:longint; 48 begin 49 readln(n,m); 50 for i:=1 to n do 51 with a[i] do 52 begin 53 read(shenfen,pai[0]); 54 if shenfen='F' then inc(fanzeishu); 55 for j:=1 to 4 do 56 read(pai[j+1],pai[j]); 57 blood:=4; 58 num:=4; 59 readln; 60 end; 61 a[1].tiaozhong:=true; 62 if fanzeishu=0 then MPwin; 63 for i:=1 to m do 64 read(p[i],p[i+1]); 65 now:=1; 66 end; 67 68 procedure delete(var pai:aa;x:longint;var num:longint); 69 var 70 i:longint; 71 begin 72 for i:=x to num-1 do 73 pai[i]:=pai[i+1]; 74 dec(num); 75 end; 76 77 function next(x:longint):longint; 78 begin 79 while true do 80 begin 81 x:=x mod n+1; 82 if a[x].blood>0 then exit(x); 83 end; 84 end; 85 86 function diyi(x,y:longint):boolean; 87 begin 88 exit(((a[x].shenfen='F') and (a[y].tiaozhong)) or ((a[x].shenfen<>'F') and (a[y].tiaofan)) or ((x=1) and (a[y].leifan))); 89 end; 90 91 function youjun(x,y:longint):boolean; 92 begin 93 exit(((a[x].shenfen='F') and (a[y].tiaofan)) or ((a[x].shenfen<>'F') and (a[y].tiaozhong))); 94 end; 95 96 procedure mopai(x:longint); 97 begin 98 if now>m then now:=m; 99 with a[x] do 100 begin 101 inc(num); 102 pai[num]:=p[now]; 103 inc(now); 104 end; 105 end; 106 107 procedure tiao(x:longint); 108 begin 109 with a[x] do 110 begin 111 if shenfen='F' then tiaofan:=true 112 else tiaozhong:=true; 113 leifan:=false; 114 end; 115 end; 116 117 function chupai(x:longint;c:char):boolean; 118 var 119 i:longint; 120 begin 121 with a[x] do 122 begin 123 for i:=1 to num do 124 if pai[i]=c then 125 begin 126 delete(pai,i,num); 127 exit(true); 128 end; 129 exit(false); 130 end; 131 end; 132 133 procedure kill(x,y:longint); 134 begin 135 if a[y].shenfen='F' then 136 begin 137 mopai(x); 138 mopai(x); 139 mopai(x); 140 end; 141 if (x=1) and (a[y].shenfen='Z') then 142 begin 143 a[x].num:=0; 144 a[x].zhuge:=false; 145 end; 146 end; 147 148 procedure decblood(x:longint); 149 begin 150 with a[x] do 151 begin 152 dec(blood); 153 if blood=0 then 154 begin 155 if chupai(x,'P')=false then 156 begin 157 if shenfen='F' then dec(fanzeishu); 158 if fanzeishu=0 then MPwin; 159 if shenfen='M' then FPwin; 160 end 161 else blood:=1; 162 end; 163 end; 164 end; 165 166 function dixiao(x:longint):boolean; 167 var 168 i:longint; 169 begin 170 i:=next(x); 171 while i<>x do 172 begin 173 if diyi(i,x) and chupai(i,'J') then 174 begin 175 tiao(i); 176 exit(true); 177 end; 178 i:=next(i); 179 end; 180 exit(false); 181 end; 182 183 procedure gongji(x,y:longint); 184 begin 185 if chupai(y,'D')=false then 186 begin 187 decblood(y); 188 if a[y].blood=0 then kill(x,y); 189 end; 190 end; 191 192 function jiuyuan(x,k:longint):boolean; 193 var 194 i:longint; 195 flag:boolean; 196 begin 197 i:=k; 198 flag:=true; 199 while true do 200 begin 201 if (i=k) and (flag=false) then break; 202 if i=k then flag:=false; 203 if (youjun(i,x)) and (chupai(i,'J')) then 204 begin 205 tiao(i); 206 flag:=true; 207 if not dixiao(i) then exit(true); 208 end; 209 i:=next(i); 210 end; 211 exit(false); 212 end; 213 214 procedure fight(x,y:longint); 215 begin 216 if (x=1) and (a[y].shenfen='Z') then 217 begin 218 decblood(y); 219 if a[y].blood=0 then kill(x,y); 220 end 221 else 222 if jiuyuan(y,x)=false then 223 begin 224 while true do 225 begin 226 if chupai(y,'K')=false then 227 begin 228 decblood(y); 229 if a[y].blood=0 then kill(x,y); 230 exit; 231 end; 232 if chupai(x,'K')=false then 233 begin 234 decblood(x); 235 if a[x].blood=0 then kill(y,x); 236 exit; 237 end; 238 end; 239 end; 240 end; 241 242 procedure nanman(x:longint); 243 var 244 i:longint; 245 begin 246 i:=next(x); 247 while i<>x do 248 begin 249 if jiuyuan(i,x)=false then 250 begin 251 if chupai(i,'K')=false then 252 begin 253 decblood(i); 254 if (i=1) and (not a[x].tiaozhong) and (not a[x].tiaofan) then a[x].leifan:=true; 255 if a[i].blood=0 then kill(x,i); 256 end; 257 end; 258 i:=next(i); 259 end; 260 end; 261 262 procedure wanjian(x:longint); 263 var 264 i:longint; 265 begin 266 i:=next(x); 267 while i<>x do 268 begin 269 if jiuyuan(i,x)=false then 270 begin 271 if chupai(i,'D')=false then 272 begin 273 decblood(i); 274 if (i=1) and (not a[x].tiaozhong) and (not a[x].tiaofan) then a[x].leifan:=true; 275 if a[i].blood=0 then kill(x,i); 276 end; 277 end; 278 i:=next(i); 279 end; 280 end; 281 282 procedure xingdong(x:longint); 283 var 284 i,k:longint; 285 begin 286 i:=1; 287 with a[x] do 288 while i<=num do 289 begin 290 if a[x].blood=0 then exit; 291 if pai[i]='N' then 292 begin 293 delete(pai,i,num); 294 nanman(x); 295 i:=1; 296 continue; 297 end; 298 if pai[i]='W' then 299 begin 300 delete(pai,i,num); 301 wanjian(x); 302 i:=1; 303 continue; 304 end; 305 if (pai[i]='K') and ((not sha) or zhuge) then 306 begin 307 k:=next(x); 308 if diyi(x,k) then 309 begin 310 delete(pai,i,num); 311 tiao(x); 312 gongji(x,k); 313 sha:=true; 314 i:=1; 315 continue; 316 end; 317 end; 318 if pai[i]='F' then 319 begin 320 k:=next(x); 321 if x=1 then 322 begin 323 while k<>x do 324 begin 325 if diyi(x,k) then 326 begin 327 delete(pai,i,num); 328 break; 329 end; 330 k:=next(k); 331 end; 332 if k<>x then 333 begin 334 fight(x,k); 335 i:=1; 336 continue; 337 end; 338 end; 339 if shenfen='F' then 340 begin 341 delete(pai,i,num); 342 tiao(x); 343 fight(x,1); 344 i:=1; 345 continue; 346 end; 347 if shenfen='Z' then 348 begin 349 while k<>x do 350 begin 351 if diyi(x,k) then 352 begin 353 delete(pai,i,num); 354 break; 355 end; 356 k:=next(k); 357 end; 358 if k<>x then 359 begin 360 tiao(x); 361 fight(x,k); 362 i:=1; 363 continue; 364 end; 365 end; 366 end; 367 if (pai[i]='P') and (blood<4) then 368 begin 369 inc(blood); 370 delete(pai,i,num); 371 i:=1; 372 continue; 373 end; 374 if pai[i]='Z' then 375 begin 376 zhuge:=true; 377 delete(pai,i,num); 378 i:=1; 379 continue; 380 end; 381 inc(i); 382 end; 383 end; 384 385 procedure work; 386 var 387 i:longint; 388 begin 389 i:=0; 390 while true do 391 begin 392 i:=i mod n+1; 393 if a[i].blood=0 then continue; 394 mopai(i); 395 mopai(i); 396 a[i].sha:=false; 397 xingdong(i); 398 end; 399 end; 400 401 begin 402 init; 403 work; 404 end.