BZOJ[1972] [Sdoi2010]猪国杀
第二道大模拟
1 #include <cmath> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 void ot(){cout<<"******"<<endl;} 9 int n,m; 10 int now_time; 11 struct PIG{ 12 int id; //0 MP; 1 ZP; 2 AP; 13 char cd[20010]; bool pd[20010]; 14 int head,tail,Hp,Eq,Z,F,SZ,SF,K,num; 15 PIG(){ 16 head=tail=0; Hp=4; Eq=0; K=0; 17 } 18 void P(){ 19 printf(" num= %d id= %d",num,id); 20 if(Hp<=0){printf(" Dead\n\n"); return;} 21 printf(" Hp= %d Eq= %d Z= %d F= %d SZ= %d SF= %d\n",Hp,Eq,Z,F,SZ,SF); 22 printf(" card: "); 23 for(int k=head;k<tail;k++){ 24 if(pd[k]) continue; 25 cout<<cd[k]<<" "; 26 } cout<<endl; 27 } 28 }p[11]; 29 int tot_FP; 30 bool MP_dead; 31 int MP; 32 void init(){ 33 scanf("%d%d",&n,&m); 34 char s[3]; 35 for(int i=0;i<n;i++){ 36 scanf("%s",&s); 37 if(s[0]=='M') p[i].id=0,MP=i; 38 if(s[0]=='Z') p[i].id=1; 39 if(s[0]=='F') p[i].id=2,tot_FP++; 40 p[i].num=i; 41 for(int j=1;j<=4;j++){ 42 scanf("%s",&s); 43 p[i].cd[p[i].tail++]=s[0]; 44 } 45 } 46 } 47 int tot_card; 48 char last; 49 void Get_card(int now,int lim){ 50 // printf("Get::\n"); 51 char s[3]; 52 // printf(" %d -- ",p[now].num); 53 for(int i=1;i<=lim;i++){ 54 tot_card++; 55 if(tot_card<=m){ 56 scanf("%s",&s); 57 p[now].cd[p[now].tail++]=s[0]; 58 last=s[0]; 59 // cout<<s[0]<<" "; 60 } 61 else{ 62 p[now].cd[p[now].tail++]=last; 63 // cout<<last<<" "; 64 } 65 66 } 67 // cout<<endl<<endl; 68 } 69 void Beg(int now){ 70 p[now].K=0; 71 } 72 bool O_fla(int k){ 73 for(int c=p[k].head;c<p[k].tail;c++){ 74 if(p[k].pd[c]) continue; 75 if(p[k].cd[c]=='D') { 76 // printf(" %d out D\n",p[k].num); 77 p[k].pd[c]=1; return 1; 78 } 79 } 80 return 0; 81 } 82 bool O_S(int k){ 83 for(int c=p[k].head;c<p[k].tail;c++){ 84 if(p[k].pd[c]) continue; 85 if(p[k].cd[c]=='K') { 86 // printf(" %d out K\n",p[k].num); 87 p[k].pd[c]=1; return 1; 88 } 89 } 90 return 0; 91 } 92 bool O_P(int now){ 93 if(p[now].Hp<4) { 94 p[now].Hp++; 95 // printf(" %d out P, and Hp++ to %d\n",p[now].num,p[now].Hp); 96 return 1; 97 } 98 return 0; 99 } 100 bool Dead(int k){ 101 if(p[k].Hp>0) return 0; 102 for(int c=p[k].head;c<p[k].tail;c++){ 103 if(p[k].pd[c]) continue; 104 if(p[k].cd[c]=='P'){ 105 p[k].pd[c]=1; p[k].Hp++; 106 // printf(" %d out P, and Hp++ to %d\n",p[k].num,p[k].Hp); 107 return 0; 108 } 109 } 110 if(p[k].id==2) tot_FP--; 111 if(p[k].id==0) MP_dead=1; 112 // printf(" %d Dead\n",p[k].num); 113 return 1; 114 } 115 bool O_K(int now){ 116 if(p[now].K && !p[now].Eq) return 0; 117 int k=(now+1)%n; while(p[k].Hp<=0) k=(k+1)%n; if(k==now) return 0; 118 if(p[now].id==0){ 119 if(p[k].F || p[k].SF){ 120 p[now].K=1; 121 // printf(" %d out K to %d\n",p[now].num,p[k].num); 122 if(O_fla(k)) return 1; 123 else{ 124 p[k].Hp--; 125 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 126 if(Dead(k)){ 127 if(p[k].id==2){ 128 if(tot_FP==0) return 1; 129 // printf(" %d Kill F , Get card::\n",p[now].num,p[k].num); 130 Get_card(now,3); 131 } 132 if(p[k].id==1){ 133 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 134 p[now].head=p[now].tail; p[now].Eq=0; return 1; 135 } 136 } 137 } 138 return 1; 139 } 140 else return 0; 141 } 142 if(p[now].id==1){ 143 if(p[k].F){ 144 p[now].K=1; p[now].Z=1; 145 // printf(" %d out K to %d, and %d Z \n",p[now].num,p[k].num,p[now].num); 146 if(O_fla(k)) return 1; 147 else{ 148 p[k].Hp--; 149 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 150 if(Dead(k)){ 151 if(p[k].id==2){ 152 if(tot_FP==0) return 1; 153 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 154 Get_card(now,3); 155 } 156 } 157 } 158 return 1; 159 } 160 else return 0; 161 } 162 if(p[now].id==2){ 163 if(p[k].id==0 || p[k].Z){ 164 p[now].K=1; p[now].F=1; 165 // printf(" %d out K to %d, and %d F \n",p[now].num,p[k].num,p[now].num); 166 if(O_fla(k)) return 1; 167 else{ 168 p[k].Hp--; 169 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 170 if(Dead(k)){ 171 if(p[k].id==2){ 172 if(tot_FP==0) return 1; 173 Get_card(now,3); 174 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 175 } 176 if(p[k].id==0){ 177 if(MP_dead) return 1; 178 } 179 } 180 } 181 return 1; 182 } 183 else return 0; 184 } 185 return 0; 186 } 187 bool Hav_J(int now){ 188 for(int c=p[now].head;c<p[now].tail;c++){ 189 if(p[now].pd[c]) continue; 190 if(p[now].cd[c]=='J'){ 191 // printf(" %d out J\n",p[now].num); 192 p[now].pd[c]=1; return 1; 193 } 194 } 195 return 0; 196 } 197 bool Tog_J(int now,int t){ 198 int k=now,cnt=0; 199 if(!t){ 200 while( cnt<n && (p[k].Hp<=0 || p[k].id!=2 || !Hav_J(k)) ) k=(k+1)%n, cnt++; 201 if(cnt==n) return 0; 202 p[k].F=1; 203 // printf(" %d F\n",p[k].num); 204 if(Tog_J(k,1)) return 0; 205 else return 1; 206 } 207 if(t){ 208 while( cnt<n && (p[k].Hp<=0 || p[k].id==2 || !Hav_J(k)) ) k=(k+1)%n, cnt++; 209 if(cnt==n) return 0; 210 p[k].Z=1; 211 // printf(" %d Z\n",p[k].num); 212 if(p[k].SF){ 213 p[k].SF=0; //printf(" so %d -> SF == 0\n",p[k].id); 214 } 215 if(Tog_J(k,0)) return 0; 216 else return 1; 217 } 218 219 } 220 bool O_F(int now){ 221 int k=(now+1)%n; while(p[k].Hp<=0) k=(k+1)%n; if(now==k) return 0; 222 int rol=1; 223 bool ok1,ok2,ok3; ok1=ok2=ok3=0; 224 if(p[now].id==0){ 225 while( ( (!p[k].F && !p[k].SF) || p[k].Hp<=0) && k!=now) k=(k+1)%n; 226 if(k==now) return 0; 227 // printf(" %d out F to %d\n",p[now].num,p[k].num); 228 if(p[k].F) ok1=1; else ok1=0; 229 if(ok1) ok2=Tog_J(now,0); if(ok1 && ok2) return 1; 230 if(p[k].id==1){ 231 // printf(" %d is ZF ,so Hp-- to %d\n",p[k].num,p[k].Hp); 232 p[k].Hp--; 233 if(Dead(k)){ 234 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 235 p[now].head=p[now].tail; p[k].Eq=0; return 1; 236 } 237 } 238 else{ 239 while(1){ 240 if(rol && !O_S(k)){ 241 p[k].Hp--; 242 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 243 if(Dead(k)){ 244 if(p[k].id==2){ 245 if(tot_FP==0) return 1; 246 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 247 Get_card(now,3); 248 return 1; 249 } 250 if(p[k].id==1){ 251 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 252 p[now].head=p[now].tail; p[now].Eq=0; return 1; 253 } 254 } 255 return 1; 256 } 257 else if(!rol && !O_S(now)){ 258 p[now].Hp--; 259 // printf(" %d Hp-- to %d\n",p[now].num,p[now].Hp); 260 if(Dead(now)) return 1; 261 return 1; 262 } 263 rol^=1; 264 } 265 } 266 } 267 if(p[now].id==1){ 268 while( ( !p[k].F || p[k].Hp<=0) && k!=now) k=(k+1)%n; 269 if(k==now) return 0; 270 p[now].Z=1; 271 // printf(" %d out F to %d, and %d Z \n",p[now].num,p[k].num,p[now].num); 272 if(p[now].SF){ 273 p[now].SF=0; //printf(" so %d -> SF == 0\n",p[now].id); 274 } 275 ok2=Tog_J(now,0); if(ok2) return 1; 276 while(1){ 277 if(rol && !O_S(k)){ 278 p[k].Hp--; 279 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 280 if(Dead(k)){ 281 if(p[k].id==2){ 282 if(tot_FP==0) return 1; 283 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 284 Get_card(now,3); 285 return 1; 286 } 287 } 288 return 1; 289 } 290 else if(!rol && !O_S(now)){ 291 p[now].Hp--; 292 // printf(" %d Hp-- to %d\n",p[now].num,p[now].Hp); 293 if(Dead(now)) return 1; 294 return 1; 295 } 296 rol^=1; 297 } 298 } 299 if(p[now].id==2){ 300 p[now].F=1; k=MP; 301 // printf(" %d out F to %d, and %d F \n",p[now].num,p[k].num,p[now].num); 302 ok2=Hav_J(k); 303 ok2=Tog_J(now,1); if(ok2) return 1; 304 while(1){ 305 if(rol && !O_S(MP)){ 306 p[MP].Hp--; 307 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 308 if(Dead(k)) return 1; 309 return 1; 310 } 311 else if(!rol && !O_S(now)){ 312 p[now].Hp--; 313 // printf(" %d Hp-- to %d\n",p[now].num,p[now].Hp); 314 if(Dead(now)){ 315 // printf(" %d Kill F %d, Get card::",p[k].num,p[now].num); 316 Get_card(MP,3); return 1; 317 } 318 return 1; 319 } 320 rol^=1; 321 } 322 } 323 return 1; 324 } 325 bool O_N(int now){ 326 int k=(now+1)%n; 327 // printf(" %d out N\n",p[now].num); 328 bool ok1,ok2,ok3; ok1=ok2=ok3=0; 329 while(k!=now){ 330 if(p[k].Hp<=0){k=(k+1)%n; continue;} 331 // printf(" Is %d turn:: ",p[k].num); 332 if( p[k].id==0 || p[k].Z){ 333 ok2=Tog_J(now,1); 334 if( !ok2 && !O_S(k)){ 335 p[k].Hp--; 336 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 337 if(p[k].id==0 && !p[now].Z){ 338 p[now].SF=1; 339 // printf(" %d is marked SF\n",p[now].num); 340 } 341 if(Dead(k)){ 342 if(p[now].id==0){ 343 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 344 p[now].head=p[now].tail, p[now].Eq=0; 345 } 346 if(p[k].id==0) {MP_dead=1; return 1;} 347 } 348 } 349 } 350 else if( p[k].F ){ 351 ok2=Tog_J(now,0); 352 if( !ok2 && !O_S(k)){ 353 p[k].Hp--; 354 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 355 if(Dead(k)){ 356 if(tot_FP==0) return 1; 357 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 358 Get_card(now,3); 359 } 360 } 361 } 362 else if(!O_S(k)){ 363 p[k].Hp--; 364 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 365 if(Dead(k)){ 366 if(p[k].id==1 && p[now].id==0){ 367 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 368 p[now].head=p[now].tail; p[now].Eq=0; 369 } 370 if(p[k].id==2){ 371 if(tot_FP==0) return 1; 372 Get_card(now,3); 373 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 374 } 375 } 376 } 377 k=(k+1)%n; 378 } 379 return 1; 380 } 381 bool O_W(int now){ 382 int k=(now+1)%n; 383 // printf(" %d out W\n",p[now].num); 384 bool ok1,ok2,ok3; ok1=ok2=ok3=0; 385 while(k!=now){ 386 if(p[k].Hp<=0){k=(k+1)%n; continue;} 387 // printf(" Is %d turn:: ",p[k].num); 388 if( p[k].id==0 || p[k].Z){ 389 ok2=Tog_J(now,1); 390 if( !ok2 && !O_fla(k)){ 391 p[k].Hp--; 392 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 393 if(p[k].id==0 && !p[now].Z){ 394 p[now].SF=1; 395 // printf(" %d is marked SF\n",p[now].num); 396 } 397 if(Dead(k)){ 398 if(p[now].id==0){ 399 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 400 p[now].head=p[now].tail, p[now].Eq=0; 401 } 402 if(p[k].id==0) {MP_dead=1; return 1;} 403 } 404 } 405 // if(now_time==4) exit(0); 406 } 407 else if( p[k].F ){ 408 ok2=Tog_J(now,0); 409 if( !ok2 && !O_fla(k)){ 410 p[k].Hp--; 411 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 412 if(Dead(k)){ 413 if(tot_FP==0) return 1; 414 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 415 Get_card(now,3); 416 } 417 } 418 } 419 else if(!O_fla(k)){ 420 p[k].Hp--; 421 // printf(" %d Hp-- to %d\n",p[k].num,p[k].Hp); 422 if(Dead(k)){ 423 if(p[k].id==1 && p[now].id==0){ 424 // printf(" %d Kill Z %d so he lose card\n",p[now].num,p[k].num); 425 p[now].head=p[now].tail; p[now].Eq=0; 426 } 427 if(p[k].id==2){ 428 if(tot_FP==0) return 1; 429 // printf(" %d Kill F %d, Get card::",p[now].num,p[k].num); 430 Get_card(now,3); 431 } 432 } 433 } 434 k=(k+1)%n; 435 } 436 return 1; 437 } 438 bool O_Z(int now){ 439 // printf(" %d out Z-G-L-N\n",p[now].num); 440 p[now].Eq=1; return 1; 441 } 442 void Out(int now){ 443 int c; int cnt=0; 444 // printf("Out::\n"); 445 for(int c=p[now].head;c<p[now].tail;c++){ 446 if(MP_dead || tot_FP==0 || p[now].Hp<=0) break; 447 if(c<p[now].head) c=p[now].head; 448 if(p[now].pd[c]) continue; cnt++; bool ok=1; 449 // if(now_time==7){p[now].P();} 450 // printf(" Card %d ::\n",cnt); 451 if(p[now].cd[c]=='P' && (ok=O_P(now)) ) p[now].pd[c]=1; 452 // if(!ok){printf(" can't out P\n");} ok=1; 453 if(p[now].cd[c]=='K' && (ok=O_K(now)) ) p[now].pd[c]=1; 454 // if(!ok){printf(" can't out K\n");} ok=1; 455 if(p[now].cd[c]=='D') { 456 // printf(" can't out D\n"); 457 continue; 458 } 459 if(p[now].cd[c]=='F' && (ok=O_F(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;} 460 // if(!ok){printf(" can't out F\n");} ok=1; 461 if(p[now].cd[c]=='N' && (ok=O_N(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;} 462 // if(!ok){printf(" can't out N\n");} ok=1; 463 if(p[now].cd[c]=='W' && (ok=O_W(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;} 464 // if(!ok){printf(" can't out W\n");} ok=1; 465 if(p[now].cd[c]=='J') { 466 // printf(" can't out J\n"); 467 continue; 468 } 469 if(p[now].cd[c]=='Z' && O_Z(now) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;} 470 } 471 while(p[now].pd[p[now].head]) p[now].head++; 472 // cout<<endl<<endl; 473 } 474 char sc[2010]; 475 void Print(){ 476 // printf("========= End at round %d ===========\n",now_time); 477 if(tot_FP==0) printf("MP\n"); 478 else printf("FP\n"); 479 for(int k=0;k<n;k++){ 480 if(p[k].Hp<=0) printf("DEAD\n"); 481 else{ 482 int tip=0; 483 for(int c=p[k].head;c<p[k].tail;c++){ 484 if(p[k].pd[c]) continue; 485 sc[++tip]=p[k].cd[c]; 486 } 487 for(int i=1;i<=tip;i++){ 488 if(i!=tip) printf("%c ",sc[i]); 489 else printf("%c",sc[i]); 490 } printf("\n"); 491 } 492 } 493 } 494 void oott(){ 495 printf("Pig::\n"); 496 for(int k=0;k<n;k++){ 497 p[k].P(); 498 } cout<<endl; 499 } 500 void Begin_game(){ 501 int now=MP; now_time=0; 502 while(1){ 503 if(p[now].Hp<=0){now=(now+1)%n; continue;} 504 now_time++; 505 // printf("--------------- round %d now= %d ------------\n",now_time,now); 506 // oott(); 507 Get_card(now,2); 508 Beg(now); 509 Out(now); 510 if(MP_dead || tot_FP==0) break; 511 now=(now+1)%n; 512 // oott(); 513 } 514 Print(); 515 } 516 int main(){ 517 // freopen("kopk7.in","r",stdin); 518 // freopen("1pigkao.out","w",stdout); 519 init(); 520 Begin_game(); 521 return 0; 522 }
开启所有注释即可打印战斗日志