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.对于无懈可击使用,是对那张无懈可击的使用者表敌意,身份显现。并且符合敌人的敌人就是朋友的性质。
      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 */ 
带注释代码(附带小样例)

  由于博主十分中二,请不要嘲笑样例游戏解说般的画风。

posted @ 2017-10-10 16:57  Hzoi_joker  阅读(887)  评论(0编辑  收藏  举报