Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4
题目可真长,读题都要一个小时。
这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精神,本蒟蒻强行斯巴达了这群猪。
为了给后面入坑的人一些提醒,本题题目较长,请耐心读完题目,否则会导致T,WA,E,特别想吃猪肉和丢脸。
据说如果你耐心照着题目打你会得到30分,于是良心的我就先说一些题目没说或说的模糊或会坑你半个小时的东西。
1.n<=10.
2.牌堆会被摸完,此时一直取最后一张。(话说不能重新把废牌洗一下吗)
3.无懈可击对非无懈可击是用时目的是要保护目标而不是恶心出牌人。
4.可以给他人使用无懈可击(博主打过三国杀,但题目真心没说明白)
5.可以不断用无懈可击无懈无懈可击。
6.无懈可击使用时先从出锦囊牌的人开始判定是否打出无懈。
7.使用决斗把自己干死时记得自己就不要出牌了。
8.类反猪不算身份明了,该身份唯一的目的就是让主公去打他。
9.不要瞎打else,博主被自己打的else坑了好几次。
10.平时不要只学习,多打点游戏很重要,说不定下次联赛就考了狼人杀(我这么立flag是不是不太好,我又不会玩狼人杀)。
11.数组在能开大的时候尽量开大点,就算是联赛也会出现数据大于给出的范围的情况。
坑说完了,现在说一下我做这道题的时间线:
第一天晚上:读题+扫雷+看指针恒直播AC,没打代码
第二天上午:买了瓶饮料,开始斯巴达,打了一个上午,开始调试,中午吃猪。
第二天晚上:花了不到30分钟调了一个小坑。
第三天早上:花了不到30分钟又调了一个小坑。
第三天下午:花了40分钟调完了最后一个坑,AC!!!Winner!Winner! Pig Dinner!
说到底,还是一个大模拟,算法什么的真的用不到太高级的,撑死就是链表。
好在题目没有给出内奸,闪电,防具,麒麟弓,猪物技能等设定,我们对于大部分操作我们基本对各个身份的猪一视同仁,游戏规则除了桃只能自己用以外和三国杀没什么不同。
最恶心人的可能就只有两点,一个是无懈可击,一个是身份判断,因此我就只说这两个了,别的就按照暴力实现就好了。
对于无懈可击,使用只有两种情况:
1.对于无懈可击使用,是对那张无懈可击的使用者表敌意,身份显现。并且符合敌人的敌人就是朋友的性质。
1.对于无懈可击使用,是对那张无懈可击的使用者表敌意,身份显现。并且符合敌人的敌人就是朋友的性质。
2.对于其他锦囊牌使用,对于即将挨打的那一方献殷勤,身份显现。
因此我们对于对无懈可击对无懈可击使用的情况单独打一个函数,因为他会无限递归。而对于锦囊牌使用无懈,我们单独复制粘贴一下就好了。
对于身份:
我们基本可以认为只要出一张非南蛮和万箭的锦囊牌就会表示身份,值得注意的是我们要在出这张牌之前把他的身份更新,这样就会为无懈可击提供目标。类反猪只是一个临时身份,一旦他跳忠后就不会再被认为是类反猪,哪怕他不管主公死活狂刷南蛮。
至于其他的,自己打一打也就差不多了。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm> 7 #include <cmath> 8 #include <map> 9 #include <set> 10 #define N 15 11 #define M 2105 12 #define tao 1 13 #define sha 2 14 #define shan 3 15 #define jue 4 16 #define man 5 17 #define wan 6 18 #define wu 7 19 #define nu 8 20 using namespace std; 21 int pre[N],fro[N],n,m,zz; 22 int st[M],top; 23 struct pi 24 { 25 int ip; 26 int jump; 27 int q[M],en,hea,hp; 28 bool ln; 29 }pig[N]; 30 char bbb[20]; 31 int check(char x) 32 { 33 if(x=='P') return tao; 34 else if(x=='K') return sha; 35 else if(x=='D') return shan; 36 else if(x=='F') return jue; 37 else if(x=='N') return man; 38 else if(x=='W') return wan; 39 else if(x=='J') return wu; 40 else return nu; 41 } 42 void get_pok(int x,int js) 43 { 44 if(js==3)return; 45 if(!top) top=1; 46 pig[x].en++; 47 pig[x].q[pig[x].en]=st[top]; 48 top--; 49 get_pok(x,js+1); 50 } 51 void zl(int x) 52 { 53 for(int j=pig[x].hea;j<=pig[x].en;j++) 54 { 55 if(pig[x].q[j]!=0) 56 { 57 pig[x].hea=j; 58 for(int k=pig[x].en;k>=pig[x].hea;k--) 59 { 60 if(pig[x].q[k]!=0) 61 { 62 pig[x].en=k; 63 break; 64 } 65 } 66 break; 67 } 68 if(j==pig[x].en) 69 { 70 pig[x].en=0; 71 pig[x].hea=pig[x].en+1; 72 } 73 } 74 } 75 void come_to_end(int x) 76 { 77 if(x==1) printf("MP\n"); 78 else printf("FP\n"); 79 int js=0; 80 for(int i=1;i<=n;i++) if(pig[i].hp) js++; 81 for(int i=1;i<=n;i++) 82 { 83 if(pig[i].hp==0) printf("DEAD\n"); 84 else 85 { 86 zl(i); 87 for(int j=pig[i].hea;j<pig[i].en;j++) 88 { 89 if(!pig[i].q[j])continue; 90 int y=pig[i].q[j]; 91 if(y==tao)printf("P "); 92 else if(y==sha)printf("K "); 93 else if(y==shan)printf("D "); 94 else if(y==nu) printf("Z "); 95 else if(y==jue) printf("F "); 96 else if(y==man) printf("N "); 97 else if(y==wan) printf("W "); 98 else if(y==wu) printf("J "); 99 } 100 int y=pig[i].q[pig[i].en]; 101 if(y==tao)printf("P"); 102 else if(y==sha)printf("K"); 103 else if(y==shan)printf("D"); 104 else if(y==nu) printf("Z"); 105 else if(y==jue) printf("F"); 106 else if(y==man) printf("N"); 107 else if(y==wan) printf("W"); 108 else if(y==wu) printf("J"); 109 printf("\n"); 110 } 111 } 112 exit(0); 113 } 114 void gua(int x,int from) 115 { 116 pre[fro[x]]=pre[x]; 117 fro[pre[x]]=fro[x]; 118 if(x==1) come_to_end(3); 119 int now=fro[1]; 120 bool yx=1; 121 while(now!=1) 122 { 123 if(pig[now].ip==3) 124 { 125 yx=0; 126 break; 127 } 128 now=fro[now]; 129 } 130 if(yx)come_to_end(1); 131 if(pig[x].ip==2&&pig[from].ip==1) 132 { 133 memset(pig[from].q,0,sizeof(pig[from].q)); 134 pig[from].ln=0; 135 pig[from].hea=1,pig[from].en=0; 136 } 137 else if(pig[x].ip==3) 138 { 139 get_pok(from,0); 140 } 141 } 142 void lost(int x,int from) 143 { 144 if(pig[x].hp==0) 145 { 146 for(int i=pig[x].hea;i<=pig[x].en;i++) 147 { 148 if(pig[x].q[i]==tao) 149 { 150 pig[x].hp++; 151 pig[x].q[i]=0; 152 zl(x); 153 return ; 154 } 155 } 156 gua(x,from); 157 } 158 } 159 void kill(int x) 160 { 161 int to=fro[x]; 162 bool yx=1; 163 for(int i=pig[to].hea;i<=pig[to].en;i++) 164 { 165 if(pig[to].q[i]==shan) 166 { 167 pig[to].q[i]=0; 168 yx=0; 169 zl(to); 170 break; 171 } 172 } 173 if(yx) 174 { 175 pig[to].hp--; 176 lost(to,x); 177 } 178 } 179 bool use_wu(int x) 180 { 181 int now=fro[x]; 182 while(now!=x) 183 { 184 if((pig[now].ip==3&&pig[x].jump!=3)||(pig[now].ip!=3&&pig[x].jump==3)) 185 { 186 for(int i=pig[now].hea;i<=pig[now].en;i++) 187 { 188 if(pig[now].q[i]==wu) 189 { 190 pig[now].q[i]=0; 191 if(pig[now].ip==3)pig[now].jump=3; 192 else if(pig[now].ip==2) pig[now].jump=2; 193 zl(now); 194 if(use_wu(now)) return 0; 195 else return 1; 196 } 197 } 198 } 199 now=fro[now]; 200 } 201 return 1; 202 } 203 void come_to_fight(int x,int y) 204 { 205 int now=fro[x]; 206 if(pig[y].jump&&pig[y].jump!=-1) 207 { 208 while(now!=x) 209 { 210 if((pig[now].ip==3&&pig[y].jump==3)||(pig[y].jump!=3&&pig[now].ip!=3)) 211 { 212 bool yx=1; 213 for(int i=pig[now].hea;i<=pig[now].en;i++) 214 { 215 if(pig[now].q[i]==wu) 216 { 217 pig[now].q[i]=0; 218 if(pig[now].ip==3)pig[now].jump=3; 219 else if(pig[now].ip==2) pig[now].jump=2; 220 zl(now); 221 yx=0; 222 if(use_wu(now))return; 223 } 224 } 225 if(!yx)break; 226 } 227 now=fro[now]; 228 } 229 } 230 if(pig[x].ip==1&&pig[y].ip==2) 231 { 232 pig[y].hp--; 233 lost(y,x); 234 return; 235 } 236 int js1=0,js2=0; 237 for(int i=pig[x].hea;i<=pig[x].en;i++) 238 { 239 if(pig[x].q[i]==sha) 240 { 241 js1++; 242 } 243 } 244 for(int i=pig[y].hea;i<=pig[y].en;i++) 245 { 246 if(pig[y].q[i]==sha) 247 { 248 js2++; 249 } 250 } 251 if(js1<js2) 252 { 253 int js3=0; 254 for(int i=pig[y].hea;i<=pig[y].en;i++) 255 { 256 if(pig[y].q[i]==sha) 257 { 258 js3++; 259 pig[y].q[i]=0; 260 if(js3==js1+1)break; 261 } 262 } 263 for(int i=pig[x].hea;i<=pig[x].en;i++) 264 { 265 if(pig[x].q[i]==sha) 266 { 267 pig[x].q[i]=0; 268 } 269 } 270 zl(x),zl(y); 271 pig[x].hp--; 272 lost(x,y); 273 } 274 else 275 { 276 int js3=0; 277 for(int i=pig[x].hea;i<=pig[x].en;i++) 278 { 279 if(pig[x].q[i]==sha) 280 { 281 if(js3==js2)break; 282 js3++; 283 pig[x].q[i]=0; 284 } 285 } 286 for(int i=pig[y].hea;i<=pig[y].en;i++) 287 { 288 if(pig[y].q[i]==sha) 289 pig[y].q[i]=0; 290 } 291 zl(x),zl(y); 292 pig[y].hp--; 293 lost(y,x); 294 } 295 } 296 void nanman(int x) 297 { 298 int now=fro[x]; 299 while(now!=x) 300 { 301 if(pig[now].jump&&pig[now].jump!=-1) 302 { 303 bool yx2=0; 304 int now2=x; 305 bool yxxx=1; 306 while(now2!=x||yxxx) 307 { 308 yxxx=0; 309 if((pig[now2].ip==3&&pig[now].jump==3)||(pig[now2].ip!=3&&pig[now].jump!=3)) 310 { 311 bool yx=1; 312 for(int i=pig[now2].hea;i<=pig[now2].en;i++) 313 { 314 if(pig[now2].q[i]==wu) 315 { 316 pig[now2].q[i]=0; 317 if(pig[now2].ip==3)pig[now2].jump=3; 318 else if(pig[now2].ip==2) pig[now2].jump=2; 319 zl(now2); 320 yx=0; 321 if(use_wu(now2)) 322 { 323 yx2=1; 324 break; 325 } 326 else break; 327 } 328 } 329 if(!yx)break; 330 } 331 if(yx2)break; 332 now2=fro[now2]; 333 } 334 if(yx2) 335 { 336 now=fro[now];continue; 337 } 338 } 339 bool yx=1; 340 for(int i=pig[now].hea;i<=pig[now].en;i++) 341 { 342 if(pig[now].q[i]==sha) 343 { 344 pig[now].q[i]=0; 345 zl(now); 346 yx=0; 347 break; 348 } 349 } 350 if(yx) 351 { 352 pig[now].hp--; 353 if(now==1&&!pig[x].jump)pig[x].jump=-1; 354 lost(now,x); 355 } 356 now=fro[now]; 357 } 358 } 359 void wanjian(int x) 360 { 361 int now=fro[x]; 362 while(now!=x) 363 { 364 if(pig[now].jump&&pig[now].jump!=-1) 365 { 366 bool yx2=0; 367 int now2=x; 368 bool yxxx=1; 369 while((now2!=x)||yxxx) 370 { 371 yxxx=0; 372 if((pig[now2].ip==3&&pig[now].jump==3)||(pig[now2].ip!=3&&pig[now].jump!=3)) 373 { 374 bool yx=1; 375 for(int i=pig[now2].hea;i<=pig[now2].en;i++) 376 { 377 if(pig[now2].q[i]==wu) 378 { 379 pig[now2].q[i]=0; 380 if(pig[now2].ip==3)pig[now2].jump=3; 381 else if(pig[now2].ip==2) pig[now2].jump=2; 382 zl(now2); 383 yx=0; 384 if(use_wu(now2)) 385 { 386 yx2=1; 387 break; 388 } 389 else break; 390 } 391 } 392 if(!yx)break; 393 } 394 if(yx2)break; 395 now2=fro[now2]; 396 } 397 if(yx2) 398 { 399 now=fro[now];continue; 400 } 401 } 402 bool yx=1; 403 for(int i=pig[now].hea;i<=pig[now].en;i++) 404 { 405 if(pig[now].q[i]==shan) 406 { 407 408 pig[now].q[i]=0; 409 zl(now); 410 yx=0; 411 break; 412 } 413 } 414 if(yx) 415 { 416 pig[now].hp--; 417 if(now==1&&!pig[x].jump)pig[x].jump=-1; 418 lost(now,x); 419 } 420 now=fro[now]; 421 } 422 } 423 void second_stage(int x,int js) 424 { 425 for(int i=pig[x].hea;i<=pig[x].en;i++) 426 { 427 if(!pig[x].q[i]||pig[x].q[i]==shan||pig[x].q[i]==wu||(pig[x].q[i]==sha&&js&&!pig[x].ln))continue; 428 if(pig[x].hp!=4&&pig[x].q[i]==tao) 429 { 430 pig[x].hp++; 431 pig[x].q[i]=0; 432 zl(x); 433 second_stage(x,js); 434 return; 435 } 436 else if(pig[x].q[i]==sha) 437 { 438 if(pig[x].ip==1&&pig[fro[x]].jump&&pig[fro[x]].jump!=2) 439 { 440 pig[x].q[i]=0; zl(x); 441 kill(x); 442 second_stage(x,js+1); 443 return; 444 } 445 else if(pig[x].ip==2&&pig[fro[x]].jump==3) 446 { 447 pig[x].jump=2; 448 pig[x].q[i]=0; zl(x); 449 kill(x); 450 second_stage(x,js+1); 451 return; 452 } 453 else if(pig[x].ip==3&&(pig[fro[x]].jump==1||pig[fro[x]].jump==2)) 454 { 455 456 pig[x].jump=3; 457 pig[x].q[i]=0; zl(x); 458 kill(x); 459 second_stage(x,js+1); 460 return; 461 } 462 } 463 else if(pig[x].q[i]==nu) 464 { 465 pig[x].q[i]=0; 466 pig[x].ln=1; 467 zl(x); 468 second_stage(x,js); 469 return; 470 } 471 else if(pig[x].q[i]==jue) 472 { 473 if(pig[x].ip==1) 474 { 475 int now=fro[1]; 476 while(now!=1) 477 { 478 if(pig[now].jump==-1||pig[now].jump==3) 479 { 480 pig[x].q[i]=0; 481 zl(x); 482 come_to_fight(x,now); 483 if(pig[x].hp==0)return; 484 second_stage(x,js); 485 return; 486 break; 487 } 488 now=fro[now]; 489 } 490 } 491 else if(pig[x].ip==2) 492 { 493 int now=fro[x]; 494 while(now!=x) 495 { 496 if(pig[now].jump==3) 497 { 498 pig[x].q[i]=0; 499 zl(x); 500 pig[x].jump=2; 501 come_to_fight(x,now); 502 if(pig[x].hp==0)return; 503 second_stage(x,js); 504 return; 505 break; 506 } 507 now=fro[now]; 508 } 509 } 510 else 511 { 512 pig[x].jump=3; 513 pig[x].q[i]=0; 514 zl(x); 515 come_to_fight(x,1); 516 if(pig[x].hp==0)return; 517 second_stage(x,js); 518 return; 519 } 520 } 521 else if(pig[x].q[i]==man) 522 { 523 pig[x].q[i]=0; 524 zl(x); 525 nanman(x); 526 second_stage(x,js); 527 return; 528 } 529 else if(pig[x].q[i]==wan) 530 { 531 pig[x].q[i]=0; 532 zl(x); 533 wanjian(x); 534 second_stage(x,js); 535 return; 536 } 537 } 538 } 539 int main() 540 { 541 scanf("%d%d",&n,&m); 542 for(int i=1;i<=n;i++) 543 { 544 pre[i]=i-1; 545 fro[i]=i+1; 546 pig[i].hp=4; 547 scanf("%s",bbb); 548 if(bbb[0]=='M')pig[i].jump=pig[i].ip=1; 549 else if(bbb[0]=='Z') pig[i].ip=2; 550 else pig[i].ip=3; 551 pig[i].hea=1; 552 for(int j=1;j<=4;j++) 553 { 554 scanf("%s",bbb); 555 pig[i].en++; 556 pig[i].q[pig[i].en]=check(bbb[0]); 557 } 558 } 559 pre[1]=n; 560 fro[n]=1; 561 top=m; 562 for(int i=1;i<=m;i++) 563 { 564 scanf("%s",bbb); 565 st[top-i+1]=check(bbb[0]); 566 } 567 int now=1; 568 while(1) 569 { 570 get_pok(now,1); 571 second_stage(now,0); 572 now=fro[now]; 573 } 574 return 0; 575 }
虽然博主打了五百多行,但主要还是因为博主码风剽悍,别急着放弃。一会就能打完。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm> 7 #include <cmath> 8 #include <map> 9 #include <set> 10 #define N 15 11 #define M 2105 12 #define tao 1 13 #define sha 2 14 #define shan 3 15 #define jue 4 16 #define man 5 17 #define wan 6 18 #define wu 7 19 #define nu 8 20 using namespace std; 21 int pre[N],fro[N],n,m; 22 int st[M],top;//牌堆,注意为0时一直摸最后一张牌 23 struct pi 24 { 25 int ip;//身份 26 int jump;//是否跳反/忠 27 int q[M],en,hea,hp;//血量 28 bool ln;//是否有连弩 29 }pig[N]; 30 char bbb[20]; 31 void print()//输出每一只猪的血量,身份,是否跳身份 32 { 33 for(int i=1;i<=n;i++) 34 { 35 cout<<pig[i].hp<<' '<<pig[i].ip<<' '<<pig[i].jump<<endl; 36 } 37 cout<<endl; 38 } 39 void print2()//输出场上有哪些玩家存活 40 { 41 int now=1;bool yx=1; 42 while(now!=1||yx) 43 { 44 yx=0; 45 cout<<now<<' '; 46 now=fro[now]; 47 } 48 cout<<endl; 49 } 50 void show(int x)//展示手牌 51 { 52 for(int i=pig[x].hea;i<=pig[x].en;i++) 53 { 54 if(pig[x].q[i]) 55 { 56 cout<<pig[x].q[i]<<' '; 57 } 58 } 59 cout<<endl<<endl; 60 } 61 int check(char x) 62 { 63 if(x=='P') return tao; 64 else if(x=='K') return sha; 65 else if(x=='D') return shan; 66 else if(x=='F') return jue; 67 else if(x=='N') return man; 68 else if(x=='W') return wan; 69 else if(x=='J') return wu; 70 else return nu; 71 } 72 void get_pok(int x,int js)//第x只猪摸的第js张牌 73 { 74 if(js==3)return; 75 if(!top) top=1; 76 pig[x].en++; 77 pig[x].q[pig[x].en]=st[top]; 78 top--; 79 get_pok(x,js+1); 80 } 81 void zl(int x)//整理玩家x手中的牌 82 { 83 for(int j=pig[x].hea;j<=pig[x].en;j++) 84 { 85 if(pig[x].q[j]!=0) 86 { 87 pig[x].hea=j; 88 for(int k=pig[x].en;k>=pig[x].hea;k--) 89 { 90 if(pig[x].q[k]!=0) 91 { 92 pig[x].en=k; 93 break; 94 } 95 } 96 break; 97 } 98 if(j==pig[x].en) 99 { 100 pig[x].en=0; 101 pig[x].hea=pig[x].en+1; 102 } 103 } 104 } 105 void come_to_end(int x)//一切都结束了 106 { 107 if(x==1) 108 printf("MP\n"); 109 else 110 printf("FP\n"); 111 int js=0; 112 for(int i=1;i<=n;i++) 113 if(pig[i].hp)js++; 114 for(int i=1;i<=n;i++) 115 { 116 if(pig[i].hp==0) printf("DEAD\n"); 117 else 118 { 119 zl(i); 120 for(int j=pig[i].hea;j<pig[i].en;j++) 121 { 122 if(!pig[i].q[j])continue; 123 int y=pig[i].q[j]; 124 if(y==tao)printf("P "); 125 else if(y==sha)printf("K "); 126 else if(y==shan)printf("D "); 127 else if(y==nu) printf("Z "); 128 else if(y==jue) printf("F "); 129 else if(y==man) printf("N "); 130 else if(y==wan) printf("W "); 131 else if(y==wu) printf("J "); 132 } 133 int y=pig[i].q[pig[i].en]; 134 if(y==tao)printf("P"); 135 else if(y==sha)printf("K"); 136 else if(y==shan)printf("D"); 137 else if(y==nu) printf("Z"); 138 else if(y==jue) printf("F"); 139 else if(y==man) printf("N"); 140 else if(y==wan) printf("W"); 141 else if(y==wu) printf("J"); 142 printf("\n"); 143 } 144 } 145 exit(0); 146 } 147 void gua(int x,int from)//被from打挂了 148 { 149 cout<<from<<"has killed "<<x<<endl; 150 pre[fro[x]]=pre[x]; 151 fro[pre[x]]=fro[x]; 152 if(x==1) come_to_end(3); 153 int now=fro[1]; 154 bool yx=1; 155 while(now!=1) 156 { 157 if(pig[now].ip==3) 158 { 159 yx=0; 160 break; 161 } 162 now=fro[now]; 163 } 164 if(yx)come_to_end(1); 165 if(pig[x].ip==2&&pig[from].ip==1) 166 { 167 memset(pig[from].q,0,sizeof(pig[from].q)); 168 pig[from].ln=0; 169 pig[from].hea=1,pig[from].en=0; 170 } 171 else if(pig[x].ip==3) 172 get_pok(from,0); 173 } 174 void lost(int x,int from)//检查是否死透 175 { 176 if(pig[x].hp==0) 177 { 178 for(int i=pig[x].hea;i<=pig[x].en;i++) 179 { 180 if(pig[x].q[i]==tao) 181 { 182 pig[x].hp++; 183 pig[x].q[i]=0; 184 zl(x); 185 return ; 186 } 187 } 188 gua(x,from); 189 } 190 } 191 void kill(int x)//x对下家出杀 192 { 193 int to=fro[x]; 194 cout<<x<<" hit "<<to<<endl; 195 bool yx=1; 196 for(int i=pig[to].hea;i<=pig[to].en;i++) 197 { 198 if(pig[to].q[i]==shan) 199 { 200 pig[to].q[i]=0; 201 yx=0; 202 zl(to); 203 break; 204 } 205 } 206 if(yx) 207 { 208 cout<<to<<"is hurt!"<<endl; 209 pig[to].hp--; 210 lost(to,x); 211 } 212 } 213 bool use_wu(int x)//x使用无懈是否成功 214 { 215 int now=fro[x]; 216 while(now!=x) 217 { 218 if((pig[now].ip==3&&pig[x].jump!=3)||(pig[now].ip!=3&&pig[x].jump==3)) 219 { 220 for(int i=pig[now].hea;i<=pig[now].en;i++) 221 { 222 if(pig[now].q[i]==wu) 223 { 224 pig[now].q[i]=0; 225 if(pig[now].ip==3)pig[now].jump=3; 226 else if(pig[now].ip==2) pig[now].jump=2; 227 zl(now); 228 if(use_wu(now)) return 0; 229 else return 1; 230 } 231 } 232 } 233 now=fro[now]; 234 } 235 return 1; 236 } 237 void come_to_fight(int x,int y)//x对y决斗 238 { 239 cout<<x<<"want to fight with "<<y<<endl; 240 int now=fro[x]; 241 if(pig[y].jump&&pig[y].jump!=-1) 242 { 243 while(now!=x) 244 { 245 if((pig[now].ip==3&&pig[y].jump==3)||(pig[y].jump!=3&&pig[now].ip!=3)) 246 { 247 bool yx=1; 248 for(int i=pig[now].hea;i<=pig[now].en;i++) 249 { 250 if(pig[now].q[i]==wu) 251 { 252 pig[now].q[i]=0; 253 if(pig[now].ip==3)pig[now].jump=3; 254 else if(pig[now].ip==2) pig[now].jump=2; 255 zl(now); 256 yx=0; 257 if(use_wu(now))return; 258 } 259 } 260 if(!yx)break; 261 } 262 now=fro[now]; 263 } 264 } 265 if(pig[x].ip==1&&pig[y].ip==2) 266 { 267 pig[y].hp--; 268 lost(y,x); 269 return; 270 } 271 int js1=0,js2=0; 272 for(int i=pig[x].hea;i<=pig[x].en;i++) 273 if(pig[x].q[i]==sha)js1++; 274 for(int i=pig[y].hea;i<=pig[y].en;i++) 275 if(pig[y].q[i]==sha) js2++; 276 if(js1<js2) 277 { 278 int js3=0; 279 for(int i=pig[y].hea;i<=pig[y].en;i++) 280 { 281 if(pig[y].q[i]==sha) 282 { 283 js3++; 284 pig[y].q[i]=0; 285 if(js3==js1+1)break; 286 } 287 } 288 for(int i=pig[x].hea;i<=pig[x].en;i++) 289 { 290 if(pig[x].q[i]==sha) 291 { 292 pig[x].q[i]=0; 293 } 294 } 295 zl(x),zl(y); 296 pig[x].hp--; 297 lost(x,y); 298 cout<<x<<"failed!"<<endl; 299 } 300 else 301 { 302 int js3=0; 303 for(int i=pig[x].hea;i<=pig[x].en;i++) 304 { 305 if(pig[x].q[i]==sha) 306 { 307 if(js3==js2)break; 308 js3++; 309 pig[x].q[i]=0; 310 } 311 } 312 for(int i=pig[y].hea;i<=pig[y].en;i++) 313 { 314 if(pig[y].q[i]==sha) 315 pig[y].q[i]=0; 316 } 317 zl(x),zl(y); 318 pig[y].hp--; 319 lost(y,x); 320 cout<<y<<"failed!"<<endl; 321 } 322 } 323 void nanman(int x) //南蛮入侵 324 { 325 cout<<"everyone need to give up a K or you will hurt by "<<x<<endl; 326 int now=fro[x]; 327 while(now!=x) 328 { 329 if(pig[now].jump&&pig[now].jump!=-1) 330 { 331 bool yx2=0; 332 int now2=x; 333 bool yxxx=1; 334 while(now2!=x||yxxx) 335 { 336 yxxx=0; 337 if((pig[now2].ip==3&&pig[now].jump==3)||(pig[now2].ip!=3&&pig[now].jump!=3)) 338 { 339 bool yx=1; 340 for(int i=pig[now2].hea;i<=pig[now2].en;i++) 341 { 342 if(pig[now2].q[i]==wu) 343 { 344 pig[now2].q[i]=0; 345 if(pig[now2].ip==3)pig[now2].jump=3; 346 else if(pig[now2].ip==2) pig[now2].jump=2; 347 zl(now2); 348 yx=0; 349 if(use_wu(now2)) 350 { 351 yx2=1; 352 break; 353 } 354 else break; 355 } 356 } 357 if(!yx)break; 358 } 359 if(yx2)break; 360 now2=fro[now2]; 361 } 362 if(yx2) 363 { 364 now=fro[now];continue; 365 } 366 } 367 bool yx=1; 368 for(int i=pig[now].hea;i<=pig[now].en;i++) 369 { 370 if(pig[now].q[i]==sha) 371 { 372 pig[now].q[i]=0; 373 zl(now); 374 yx=0; 375 break; 376 } 377 } 378 if(yx) 379 { 380 pig[now].hp--; 381 if(now==1&&!pig[x].jump)pig[x].jump=-1; 382 lost(now,x); 383 } 384 now=fro[now]; 385 } 386 } 387 void wanjian(int x) //万箭齐发 388 { 389 cout<<"everyone need to give up a D or you will hurt by "<<x<<endl; 390 int now=fro[x]; 391 while(now!=x) 392 { 393 if(pig[now].jump&&pig[now].jump!=-1) 394 { 395 bool yx2=0; 396 int now2=x; 397 bool yxxx=1; 398 while((now2!=x)||yxxx) 399 { 400 yxxx=0; 401 if((pig[now2].ip==3&&pig[now].jump==3)||(pig[now2].ip!=3&&pig[now].jump!=3)) 402 { 403 bool yx=1; 404 for(int i=pig[now2].hea;i<=pig[now2].en;i++) 405 { 406 if(pig[now2].q[i]==wu) 407 { 408 pig[now2].q[i]=0; 409 if(pig[now2].ip==3)pig[now2].jump=3; 410 else if(pig[now2].ip==2) pig[now2].jump=2; 411 zl(now2); 412 yx=0; 413 if(use_wu(now2)) 414 { 415 yx2=1; 416 break; 417 } 418 else break; 419 } 420 } 421 if(!yx)break; 422 } 423 if(yx2)break; 424 now2=fro[now2]; 425 } 426 if(yx2) 427 { 428 now=fro[now];continue; 429 } 430 } 431 bool yx=1; 432 for(int i=pig[now].hea;i<=pig[now].en;i++) 433 { 434 if(pig[now].q[i]==shan) 435 { 436 437 pig[now].q[i]=0; 438 zl(now); 439 yx=0; 440 break; 441 } 442 } 443 if(yx) 444 { 445 pig[now].hp--; 446 if(now==1&&!pig[x].jump)pig[x].jump=-1; 447 lost(now,x); 448 } 449 now=fro[now]; 450 } 451 } 452 void second_stage(int x,int js) //出牌阶段,出了几张杀 453 { 454 cout<<x<<' '<<js<<endl; 455 print(); 456 for(int i=pig[x].hea;i<=pig[x].en;i++) 457 { 458 if(!pig[x].q[i]||pig[x].q[i]==shan||pig[x].q[i]==wu||(pig[x].q[i]==sha&&js&&!pig[x].ln))continue; 459 if(pig[x].hp!=4&&pig[x].q[i]==tao) 460 { 461 cout<<x<<"come back to life"<<endl; 462 pig[x].hp++; 463 pig[x].q[i]=0; 464 zl(x); 465 second_stage(x,js); 466 return; 467 } 468 else if(pig[x].q[i]==sha) 469 { 470 if(pig[x].ip==1&&pig[fro[x]].jump&&pig[fro[x]].jump!=2) 471 { 472 pig[x].q[i]=0; zl(x); 473 kill(x); 474 second_stage(x,js+1); 475 return; 476 } 477 else if(pig[x].ip==2&&pig[fro[x]].jump==3) 478 { 479 pig[x].jump=2; 480 pig[x].q[i]=0; zl(x); 481 kill(x); 482 second_stage(x,js+1); 483 return; 484 } 485 else if(pig[x].ip==3&&(pig[fro[x]].jump==1||pig[fro[x]].jump==2)) 486 { 487 pig[x].jump=3; 488 pig[x].q[i]=0; zl(x); 489 kill(x); 490 second_stage(x,js+1); 491 return; 492 } 493 } 494 else if(pig[x].q[i]==nu) 495 { 496 pig[x].q[i]=0; 497 pig[x].ln=1; 498 zl(x); 499 second_stage(x,js); 500 return; 501 } 502 else if(pig[x].q[i]==jue) 503 { 504 if(pig[x].ip==1) 505 { 506 int now=fro[1]; 507 while(now!=1) 508 { 509 if(pig[now].jump==-1||pig[now].jump==3) 510 { 511 pig[x].q[i]=0; 512 zl(x); 513 come_to_fight(x,now); 514 if(pig[x].hp==0)return; 515 second_stage(x,js); 516 return; 517 break; 518 } 519 now=fro[now]; 520 } 521 } 522 else if(pig[x].ip==2) 523 { 524 int now=fro[x]; 525 while(now!=x) 526 { 527 if(pig[now].jump==3) 528 { 529 pig[x].q[i]=0; 530 zl(x); 531 pig[x].jump=2; 532 come_to_fight(x,now); 533 if(pig[x].hp==0)return; 534 second_stage(x,js); 535 return; 536 break; 537 } 538 now=fro[now]; 539 } 540 } 541 else 542 { 543 pig[x].jump=3; 544 pig[x].q[i]=0; 545 zl(x); 546 come_to_fight(x,1); 547 if(pig[x].hp==0)return; 548 second_stage(x,js); 549 return; 550 } 551 } 552 else if(pig[x].q[i]==man) 553 { 554 pig[x].q[i]=0; 555 zl(x); 556 nanman(x); 557 second_stage(x,js); 558 return; 559 } 560 else if(pig[x].q[i]==wan) 561 { 562 pig[x].q[i]=0; 563 zl(x); 564 wanjian(x); 565 second_stage(x,js); 566 return; 567 } 568 } 569 } 570 int main() 571 { 572 scanf("%d%d",&n,&m); 573 for(int i=1;i<=n;i++) 574 { 575 pre[i]=i-1; 576 fro[i]=i+1; 577 pig[i].hp=4; 578 scanf("%s",bbb); 579 if(bbb[0]=='M')pig[i].jump=pig[i].ip=1;//主公 580 else if(bbb[0]=='Z') pig[i].ip=2;//忠臣 581 else pig[i].ip=3;//反贼 582 pig[i].hea=1; 583 for(int j=1;j<=4;j++) 584 { 585 scanf("%s",bbb); 586 pig[i].en++; 587 pig[i].q[pig[i].en]=check(bbb[0]); 588 } 589 } 590 pre[1]=n; 591 fro[n]=1; 592 top=m; 593 for(int i=1;i<=m;i++) 594 { 595 scanf("%s",bbb); 596 st[top-i+1]=check(bbb[0]); 597 } 598 int now=1; 599 while(1) 600 { 601 get_pok(now,1);//当前猪摸牌 602 second_stage(now,0); 603 now=fro[now]; 604 } 605 return 0; 606 } 607 /*3 4 608 MP J J K N 609 ZP J D K W 610 FP P N P K 611 J J K W 612 613 3 1 614 MP D N F K 615 ZP F W F N 616 FP D N N D 617 K 618 619 5 10 620 MP W D F K 621 ZP N N D D 622 FP F W W K 623 ZP K K N D 624 FP K D P W 625 J K W K D N N K J N 626 627 3 10 628 MP W D J W 629 ZP J P D N 630 FP N D F F 631 J D N N F J J D K W 632 633 3 6 634 MP W J J D 635 FP N F F K 636 ZP J J F F 637 P P K K F W 638 */
由于博主十分中二,请不要嘲笑样例游戏解说般的画风。