Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

时间:2024-06-28 23:03:56
猪国杀 - 可读版本 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.对于其他锦囊牌使用,对于即将挨打的那一方献殷勤,身份显现。
     因此我们对于对无懈可击对无懈可击使用的情况单独打一个函数,因为他会无限递归。而对于锦囊牌使用无懈,我们单独复制粘贴一下就好了。
   对于身份:
     我们基本可以认为只要出一张非南蛮和万箭的锦囊牌就会表示身份,值得注意的是我们要在出这张牌之前把他的身份更新,这样就会为无懈可击提供目标。类反猪只是一个临时身份,一旦他跳忠后就不会再被认为是类反猪,哪怕他不管主公死活狂刷南蛮。
  至于其他的,自己打一打也就差不多了。
 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#define N 15
#define M 2105
#define tao 1
#define sha 2
#define shan 3
#define jue 4
#define man 5
#define wan 6
#define wu 7
#define nu 8
using namespace std;
int pre[N],fro[N],n,m,zz;
int st[M],top;
struct pi
{
int ip;
int jump;
int q[M],en,hea,hp;
bool ln;
}pig[N];
char bbb[];
int check(char x)
{
if(x=='P') return tao;
else if(x=='K') return sha;
else if(x=='D') return shan;
else if(x=='F') return jue;
else if(x=='N') return man;
else if(x=='W') return wan;
else if(x=='J') return wu;
else return nu;
}
void get_pok(int x,int js)
{
if(js==)return;
if(!top) top=;
pig[x].en++;
pig[x].q[pig[x].en]=st[top];
top--;
get_pok(x,js+);
}
void zl(int x)
{
for(int j=pig[x].hea;j<=pig[x].en;j++)
{
if(pig[x].q[j]!=)
{
pig[x].hea=j;
for(int k=pig[x].en;k>=pig[x].hea;k--)
{
if(pig[x].q[k]!=)
{
pig[x].en=k;
break;
}
}
break;
}
if(j==pig[x].en)
{
pig[x].en=;
pig[x].hea=pig[x].en+;
}
}
}
void come_to_end(int x)
{
if(x==) printf("MP\n");
else printf("FP\n");
int js=;
for(int i=;i<=n;i++) if(pig[i].hp) js++;
for(int i=;i<=n;i++)
{
if(pig[i].hp==) printf("DEAD\n");
else
{
zl(i);
for(int j=pig[i].hea;j<pig[i].en;j++)
{
if(!pig[i].q[j])continue;
int y=pig[i].q[j];
if(y==tao)printf("P ");
else if(y==sha)printf("K ");
else if(y==shan)printf("D ");
else if(y==nu) printf("Z ");
else if(y==jue) printf("F ");
else if(y==man) printf("N ");
else if(y==wan) printf("W ");
else if(y==wu) printf("J ");
}
int y=pig[i].q[pig[i].en];
if(y==tao)printf("P");
else if(y==sha)printf("K");
else if(y==shan)printf("D");
else if(y==nu) printf("Z");
else if(y==jue) printf("F");
else if(y==man) printf("N");
else if(y==wan) printf("W");
else if(y==wu) printf("J");
printf("\n");
}
}
exit();
}
void gua(int x,int from)
{
pre[fro[x]]=pre[x];
fro[pre[x]]=fro[x];
if(x==) come_to_end();
int now=fro[];
bool yx=;
while(now!=)
{
if(pig[now].ip==)
{
yx=;
break;
}
now=fro[now];
}
if(yx)come_to_end();
if(pig[x].ip==&&pig[from].ip==)
{
memset(pig[from].q,,sizeof(pig[from].q));
pig[from].ln=;
pig[from].hea=,pig[from].en=;
}
else if(pig[x].ip==)
{
get_pok(from,);
}
}
void lost(int x,int from)
{
if(pig[x].hp==)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
return ;
}
}
gua(x,from);
}
}
void kill(int x)
{
int to=fro[x];
bool yx=;
for(int i=pig[to].hea;i<=pig[to].en;i++)
{
if(pig[to].q[i]==shan)
{
pig[to].q[i]=;
yx=;
zl(to);
break;
}
}
if(yx)
{
pig[to].hp--;
lost(to,x);
}
}
bool use_wu(int x)
{
int now=fro[x];
while(now!=x)
{
if((pig[now].ip==&&pig[x].jump!=)||(pig[now].ip!=&&pig[x].jump==))
{
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
if(use_wu(now)) return ;
else return ;
}
}
}
now=fro[now];
}
return ;
}
void come_to_fight(int x,int y)
{
int now=fro[x];
if(pig[y].jump&&pig[y].jump!=-)
{
while(now!=x)
{
if((pig[now].ip==&&pig[y].jump==)||(pig[y].jump!=&&pig[now].ip!=))
{
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
yx=;
if(use_wu(now))return;
}
}
if(!yx)break;
}
now=fro[now];
}
}
if(pig[x].ip==&&pig[y].ip==)
{
pig[y].hp--;
lost(y,x);
return;
}
int js1=,js2=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
js1++;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js2++;
}
}
if(js1<js2)
{
int js3=;
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js3++;
pig[y].q[i]=;
if(js3==js1+)break;
}
}
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
pig[x].q[i]=;
}
}
zl(x),zl(y);
pig[x].hp--;
lost(x,y);
}
else
{
int js3=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
if(js3==js2)break;
js3++;
pig[x].q[i]=;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
pig[y].q[i]=;
}
zl(x),zl(y);
pig[y].hp--;
lost(y,x);
}
}
void nanman(int x)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while(now2!=x||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==sha)
{
pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void wanjian(int x)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while((now2!=x)||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==shan)
{ pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void second_stage(int x,int js)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
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;
if(pig[x].hp!=&&pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==sha)
{
if(pig[x].ip==&&pig[fro[x]].jump&&pig[fro[x]].jump!=)
{
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&pig[fro[x]].jump==)
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&(pig[fro[x]].jump==||pig[fro[x]].jump==))
{ pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
}
else if(pig[x].q[i]==nu)
{
pig[x].q[i]=;
pig[x].ln=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==jue)
{
if(pig[x].ip==)
{
int now=fro[];
while(now!=)
{
if(pig[now].jump==-||pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else if(pig[x].ip==)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
pig[x].jump=;
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else
{
pig[x].jump=;
pig[x].q[i]=;
zl(x);
come_to_fight(x,);
if(pig[x].hp==)return;
second_stage(x,js);
return;
}
}
else if(pig[x].q[i]==man)
{
pig[x].q[i]=;
zl(x);
nanman(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==wan)
{
pig[x].q[i]=;
zl(x);
wanjian(x);
second_stage(x,js);
return;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
pre[i]=i-;
fro[i]=i+;
pig[i].hp=;
scanf("%s",bbb);
if(bbb[]=='M')pig[i].jump=pig[i].ip=;
else if(bbb[]=='Z') pig[i].ip=;
else pig[i].ip=;
pig[i].hea=;
for(int j=;j<=;j++)
{
scanf("%s",bbb);
pig[i].en++;
pig[i].q[pig[i].en]=check(bbb[]);
}
}
pre[]=n;
fro[n]=;
top=m;
for(int i=;i<=m;i++)
{
scanf("%s",bbb);
st[top-i+]=check(bbb[]);
}
int now=;
while()
{
get_pok(now,);
second_stage(now,);
now=fro[now];
}
return ;
}

无注释版代码

  虽然博主打了五百多行,但主要还是因为博主码风剽悍,别急着放弃。一会就能打完。

 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#define N 15
#define M 2105
#define tao 1
#define sha 2
#define shan 3
#define jue 4
#define man 5
#define wan 6
#define wu 7
#define nu 8
using namespace std;
int pre[N],fro[N],n,m;
int st[M],top;//牌堆,注意为0时一直摸最后一张牌
struct pi
{
int ip;//身份
int jump;//是否跳反/忠
int q[M],en,hea,hp;//血量
bool ln;//是否有连弩
}pig[N];
char bbb[];
void print()//输出每一只猪的血量,身份,是否跳身份
{
for(int i=;i<=n;i++)
{
cout<<pig[i].hp<<' '<<pig[i].ip<<' '<<pig[i].jump<<endl;
}
cout<<endl;
}
void print2()//输出场上有哪些玩家存活
{
int now=;bool yx=;
while(now!=||yx)
{
yx=;
cout<<now<<' ';
now=fro[now];
}
cout<<endl;
}
void show(int x)//展示手牌
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i])
{
cout<<pig[x].q[i]<<' ';
}
}
cout<<endl<<endl;
}
int check(char x)
{
if(x=='P') return tao;
else if(x=='K') return sha;
else if(x=='D') return shan;
else if(x=='F') return jue;
else if(x=='N') return man;
else if(x=='W') return wan;
else if(x=='J') return wu;
else return nu;
}
void get_pok(int x,int js)//第x只猪摸的第js张牌
{
if(js==)return;
if(!top) top=;
pig[x].en++;
pig[x].q[pig[x].en]=st[top];
top--;
get_pok(x,js+);
}
void zl(int x)//整理玩家x手中的牌
{
for(int j=pig[x].hea;j<=pig[x].en;j++)
{
if(pig[x].q[j]!=)
{
pig[x].hea=j;
for(int k=pig[x].en;k>=pig[x].hea;k--)
{
if(pig[x].q[k]!=)
{
pig[x].en=k;
break;
}
}
break;
}
if(j==pig[x].en)
{
pig[x].en=;
pig[x].hea=pig[x].en+;
}
}
}
void come_to_end(int x)//一切都结束了
{
if(x==)
printf("MP\n");
else
printf("FP\n");
int js=;
for(int i=;i<=n;i++)
if(pig[i].hp)js++;
for(int i=;i<=n;i++)
{
if(pig[i].hp==) printf("DEAD\n");
else
{
zl(i);
for(int j=pig[i].hea;j<pig[i].en;j++)
{
if(!pig[i].q[j])continue;
int y=pig[i].q[j];
if(y==tao)printf("P ");
else if(y==sha)printf("K ");
else if(y==shan)printf("D ");
else if(y==nu) printf("Z ");
else if(y==jue) printf("F ");
else if(y==man) printf("N ");
else if(y==wan) printf("W ");
else if(y==wu) printf("J ");
}
int y=pig[i].q[pig[i].en];
if(y==tao)printf("P");
else if(y==sha)printf("K");
else if(y==shan)printf("D");
else if(y==nu) printf("Z");
else if(y==jue) printf("F");
else if(y==man) printf("N");
else if(y==wan) printf("W");
else if(y==wu) printf("J");
printf("\n");
}
}
exit();
}
void gua(int x,int from)//被from打挂了
{
cout<<from<<"has killed "<<x<<endl;
pre[fro[x]]=pre[x];
fro[pre[x]]=fro[x];
if(x==) come_to_end();
int now=fro[];
bool yx=;
while(now!=)
{
if(pig[now].ip==)
{
yx=;
break;
}
now=fro[now];
}
if(yx)come_to_end();
if(pig[x].ip==&&pig[from].ip==)
{
memset(pig[from].q,,sizeof(pig[from].q));
pig[from].ln=;
pig[from].hea=,pig[from].en=;
}
else if(pig[x].ip==)
get_pok(from,);
}
void lost(int x,int from)//检查是否死透
{
if(pig[x].hp==)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
return ;
}
}
gua(x,from);
}
}
void kill(int x)//x对下家出杀
{
int to=fro[x];
cout<<x<<" hit "<<to<<endl;
bool yx=;
for(int i=pig[to].hea;i<=pig[to].en;i++)
{
if(pig[to].q[i]==shan)
{
pig[to].q[i]=;
yx=;
zl(to);
break;
}
}
if(yx)
{
cout<<to<<"is hurt!"<<endl;
pig[to].hp--;
lost(to,x);
}
}
bool use_wu(int x)//x使用无懈是否成功
{
int now=fro[x];
while(now!=x)
{
if((pig[now].ip==&&pig[x].jump!=)||(pig[now].ip!=&&pig[x].jump==))
{
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
if(use_wu(now)) return ;
else return ;
}
}
}
now=fro[now];
}
return ;
}
void come_to_fight(int x,int y)//x对y决斗
{
cout<<x<<"want to fight with "<<y<<endl;
int now=fro[x];
if(pig[y].jump&&pig[y].jump!=-)
{
while(now!=x)
{
if((pig[now].ip==&&pig[y].jump==)||(pig[y].jump!=&&pig[now].ip!=))
{
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
yx=;
if(use_wu(now))return;
}
}
if(!yx)break;
}
now=fro[now];
}
}
if(pig[x].ip==&&pig[y].ip==)
{
pig[y].hp--;
lost(y,x);
return;
}
int js1=,js2=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
if(pig[x].q[i]==sha)js1++;
for(int i=pig[y].hea;i<=pig[y].en;i++)
if(pig[y].q[i]==sha) js2++;
if(js1<js2)
{
int js3=;
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js3++;
pig[y].q[i]=;
if(js3==js1+)break;
}
}
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
pig[x].q[i]=;
}
}
zl(x),zl(y);
pig[x].hp--;
lost(x,y);
cout<<x<<"failed!"<<endl;
}
else
{
int js3=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
if(js3==js2)break;
js3++;
pig[x].q[i]=;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
pig[y].q[i]=;
}
zl(x),zl(y);
pig[y].hp--;
lost(y,x);
cout<<y<<"failed!"<<endl;
}
}
void nanman(int x) //南蛮入侵
{
cout<<"everyone need to give up a K or you will hurt by "<<x<<endl;
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while(now2!=x||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==sha)
{
pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void wanjian(int x) //万箭齐发
{
cout<<"everyone need to give up a D or you will hurt by "<<x<<endl;
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while((now2!=x)||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==shan)
{ pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void second_stage(int x,int js) //出牌阶段,出了几张杀
{
cout<<x<<' '<<js<<endl;
print();
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
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;
if(pig[x].hp!=&&pig[x].q[i]==tao)
{
cout<<x<<"come back to life"<<endl;
pig[x].hp++;
pig[x].q[i]=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==sha)
{
if(pig[x].ip==&&pig[fro[x]].jump&&pig[fro[x]].jump!=)
{
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&pig[fro[x]].jump==)
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&(pig[fro[x]].jump==||pig[fro[x]].jump==))
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
}
else if(pig[x].q[i]==nu)
{
pig[x].q[i]=;
pig[x].ln=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==jue)
{
if(pig[x].ip==)
{
int now=fro[];
while(now!=)
{
if(pig[now].jump==-||pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else if(pig[x].ip==)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
pig[x].jump=;
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else
{
pig[x].jump=;
pig[x].q[i]=;
zl(x);
come_to_fight(x,);
if(pig[x].hp==)return;
second_stage(x,js);
return;
}
}
else if(pig[x].q[i]==man)
{
pig[x].q[i]=;
zl(x);
nanman(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==wan)
{
pig[x].q[i]=;
zl(x);
wanjian(x);
second_stage(x,js);
return;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
pre[i]=i-;
fro[i]=i+;
pig[i].hp=;
scanf("%s",bbb);
if(bbb[]=='M')pig[i].jump=pig[i].ip=;//主公
else if(bbb[]=='Z') pig[i].ip=;//忠臣
else pig[i].ip=;//反贼
pig[i].hea=;
for(int j=;j<=;j++)
{
scanf("%s",bbb);
pig[i].en++;
pig[i].q[pig[i].en]=check(bbb[]);
}
}
pre[]=n;
fro[n]=;
top=m;
for(int i=;i<=m;i++)
{
scanf("%s",bbb);
st[top-i+]=check(bbb[]);
}
int now=;
while()
{
get_pok(now,);//当前猪摸牌
second_stage(now,);
now=fro[now];
}
return ;
}
/*3 4
MP J J K N
ZP J D K W
FP P N P K
J J K W 3 1
MP D N F K
ZP F W F N
FP D N N D
K 5 10
MP W D F K
ZP N N D D
FP F W W K
ZP K K N D
FP K D P W
J K W K D N N K J N 3 10
MP W D J W
ZP J P D N
FP N D F F
J D N N F J J D K W 3 6
MP W J J D
FP N F F K
ZP J J F F
P P K K F W
*/

带注释代码(附带小样例)

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