猪国杀 大模拟
直接上code
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
#define ll long long
#define pr(x) ((x)->pr)
#define nx(x) ((x)->nx)
#define v(x) ((x)->v)
#define id(x) ((x)->id)
#define fi(x) ((x)->fi)
#define en(x) ((x)->en)
#define fan(x) ((x)->fan)
#define lei(x) ((x)->lei)
#define zhong(x) ((x)->zhong)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{
char q=getchar();int ans=0,flag=1;
while(q<'0'||q>'9'){if(q=='-')flag=-1;q=getchar();}
while(q>='0'&&q<='9'){ans=ans*10+q-'0';q=getchar();}
return ans*flag;
}
const int N=13;
const int M=2006;
int ppre[N],pnxt[N];
int n,m,yuann;
char s[5];
char c[M];
int pre[M],nxt[M],nowcard;
int numfan;
// 0_MP 1_ZP 2_FP
// P桃 K杀 D闪 F决斗 N南蛮 W万箭 J无懈 Z诸葛
struct Card
{
char v;
Card *pr,*nx;
Card(){pr=NULL;nx=NULL;}
Card(char _v){v=_v;pr=NULL;nx=NULL;}
};
struct Pig
{
int id,blood;
bool lei,fan,zhong,live,ifz;
Card *fi,*en;
Pig(){fi=NULL;en=NULL;}
Pig(char _id){id=_id;fi=NULL;en=NULL;}
inline void chu()
{
lei=fan=zhong=ifz=0;live=1;
blood=4;
fi=new Card(0);en=new Card(0);
nx(fi)=en;pr(en)=fi;
}
inline void add(char _v)
{
Card *x=new Card(_v);
nx(pr(en))=x;
pr(x)=pr(en);nx(x)=en;
pr(en)=x;
}
inline void del(Card *&x)
{
nx(pr(x))=nx(x);pr(nx(x))=pr(x);
}
inline void get_card(int num)
{
for(int i=1;i<=num;++i)
{
nowcard=nxt[nowcard];
add(c[nowcard]);
}
}
inline Card * have_shan()
{
for(Card *x=nx(fi);x!=en;x=nx(x))
if(v(x)=='D')
return x;
return NULL;
}
inline Card * have_wuxie()
{
for(Card *x=nx(fi);x!=en;x=nx(x))
if(v(x)=='J')
return x;
return NULL;
}
inline Card * have_sha()
{
for(Card *x=nx(fi);x!=en;x=nx(x))
if(v(x)=='K')
return x;
return NULL;
}
inline void self_help()
{
for(Card *x=nx(fi);x!=en;x=nx(x))
if(v(x)=='P')
{
++blood;
del(x);
if(blood>0)
return ;
}
}
inline void showcard()
{
for(Card *x=nx(fi);x!=en;x=nx(x))
printf("%c ",v(x));
printf("\n");
}
inline void card_is_none()
{
nx(fi)=en;
pr(en)=fi;
ifz=0;//装备牌也要弃...
}
inline void out1()
{
printf("blood=%d lei=%d fan=%d zhong=%d ifz=%d ",blood,lei,fan,zhong,ifz);
for(Card *x=nx(fi);x!=en;x=nx(x))
printf("%c ",v(x));
printf("\n");
}
}p[N];
inline void judge_attack(int who,int now)
{
if(p[now].id==0||p[now].zhong)
p[who].lei=0,p[who].fan=1;
else
if(p[now].fan)
{
p[who].lei=0;
if(p[who].id==1)
p[who].zhong=1;
}
}
inline void judge_help(int who,int now)
{
if(p[now].id==0||p[now].zhong)
{
p[who].lei=0;
if(p[who].id==1)
p[who].zhong=1;
}
else
if(p[now].fan)
{
p[who].lei=0;
p[who].fan=1;
}
}
inline void judge_lei(int who,int now)
{
if(p[now].id==0)
{
if(p[who].id==1&&!p[who].zhong)
p[who].lei=1;
else
if(p[who].id==2&&!p[who].fan)
p[who].lei=1;
}
}
inline void delpig(int order)
{
--n;
if(p[order].id==2)
--numfan;
p[order].live=0;
pnxt[ppre[order]]=pnxt[order];
ppre[pnxt[order]]=ppre[order];
}
inline void showpig()
{
for(int i=1;i<=yuann;++i)
{
if(p[i].live)
p[i].showcard();
else
printf("DEAD\n");
}
}
inline void MPdie()
{
printf("FP\n");
showpig();
exit(0);
}
inline void FPdie()
{
printf("MP\n");
showpig();
exit(0);
}
inline void help(int who,int now)
{
p[now].self_help();
if(p[now].blood<=0)
{
delpig(now);
if(p[now].id==0)
MPdie();
if(!numfan)
FPdie();
if(p[now].id==1&&p[who].id==0)
p[who].card_is_none();
else
if(p[now].id==2)
p[who].get_card(3);
}
}
inline void get_hurt(int who,int now)
{
--p[now].blood;
if(p[now].blood<=0)
help(who,now);
}
inline void attack(int now,int aid)
{
judge_attack(now,aid);
Card *x=p[aid].have_shan();
if(x==NULL)
get_hurt(now,aid);
else
p[aid].del(x);
if(p[aid].id==0||p[aid].zhong)
p[now].fan=1,p[now].lei=0;
else
if(p[aid].fan)
p[now].zhong=1,p[now].lei=0;
}
inline bool is_friend(int now,int aid)
{
return ((p[now].id==0||p[now].id==1)&&(p[aid].id==0||p[aid].zhong))||(p[now].id==2&&p[aid].fan);
}
inline bool is_enemy(int now,int aid)
{
return ((p[now].id==1||p[now].id==0)&&p[aid].fan)||(p[now].id==2&&(p[aid].id==0||p[aid].zhong));
}
inline void wuxie(int be,int aid,int &ff)
{
int nowp=be;
Card *x;
for(int i=1;i<=n;++i,nowp=pnxt[nowp])
{
x=p[nowp].have_wuxie();
if( is_enemy(nowp,aid)&&x!=NULL )
{
judge_attack(nowp,aid);
ff^=1;
p[nowp].del(x);
wuxie(nowp,nowp,ff);
return ;
}
}
}
inline int WUXIE(int now,int aid)
{
int nowp=now,ff;
Card *x;
for(int i=1;i<=n;++i,nowp=pnxt[nowp])
{
x=p[nowp].have_wuxie();
if( is_friend(nowp,aid)&&x!=NULL )
{
judge_help(nowp,aid);
ff=1;
p[nowp].del(x);
wuxie(nowp,nowp,ff);
return ff;
}
}
return 0;
}
inline void MPF2(int now,int aid)
{
if(WUXIE(now,aid))
return ;
if(p[now].id==0&&p[aid].id==1)
{
get_hurt(now,aid);
return ;
}
int who=0;
Card *x;
while(1)
{
who^=1;
if(who)
{
x=p[aid].have_sha();
if(x==NULL)
{
get_hurt(now,aid);
break;
}
else
p[aid].del(x);
}
else
{
x=p[now].have_sha();
if(x==NULL)
{
get_hurt(aid,now);
break;
}
else
p[now].del(x);
}
}
}
inline int MPF(int now,Card *x)
{
int nowp=pnxt[now];
for(int i=1;i<n;++i,nowp=pnxt[nowp])
{
if(p[nowp].lei||p[nowp].fan)
{
p[now].del(x);
judge_attack(now,nowp);
MPF2(now,nowp);
return 1;
}
}
return 0;
}
inline void nanman(int now)
{
int nowp=pnxt[now];
Card *x;
int tt=n;// 防止死人之后少枚举
for(int i=1;i<tt;++i,nowp=pnxt[nowp])
{
if(WUXIE(now,nowp))
continue;
x=p[nowp].have_sha();
if(x==NULL)
get_hurt(now,nowp),judge_lei(now,nowp);
else
p[nowp].del(x);
}
}
inline void wanjian(int now)
{
int nowp=pnxt[now];
Card *x;
int tt=n;
for(int i=1;i<tt;++i,nowp=pnxt[nowp])
{
if(WUXIE(now,nowp))
continue;
x=p[nowp].have_shan();
if(x==NULL)
get_hurt(now,nowp),judge_lei(now,nowp);
else
p[nowp].del(x);
}
}
inline void MP(int now)
{
int nowp,attacknum=0;
for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
{
if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
if(v(x)=='K'&&(!attacknum||p[now].ifz))
{
nowp=pnxt[now];
if(p[nowp].lei||p[nowp].fan)
++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
}
if(v(x)=='F')if(MPF(now,x))x=p[now].fi;
if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;
if(!p[now].live)//我的猪跟别人决斗死了还在继续出牌...
break;
}
}
inline void is_MP(int now)
{
p[now].get_card(2);
MP(now);
}
inline void ZPF2(int now,int aid)
{
if(WUXIE(now,aid))
return ;
int who=0;
Card *x;
while(1)
{
who^=1;
if(who)
{
x=p[aid].have_sha();
if(x==NULL)
{
get_hurt(now,aid);
break;
}
else
p[aid].del(x);
}
else
{
x=p[now].have_sha();
if(x==NULL)
{
get_hurt(aid,now);
break;
}
else
p[now].del(x);
}
}
}
inline int ZPF(int now,Card *x)
{
int nowp=pnxt[now];
for(int i=1;i<n;++i,nowp=pnxt[nowp])
{
if( p[nowp].fan )
{
p[now].del(x);
judge_attack(now,nowp);
ZPF2(now,nowp);
return 1;
}
}
return 0;
}
inline void ZP(int now)
{
int nowp,attacknum=0;
for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
{
if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
if(v(x)=='K'&&(!attacknum||p[now].ifz))
{
nowp=pnxt[now];
if(p[nowp].fan)
++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
}
if(v(x)=='F')if(ZPF(now,x))x=p[now].fi;
if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;
if(!p[now].live)
break;
}
}
inline void is_ZP(int now)
{
p[now].get_card(2);
ZP(now);
}
inline void FPF2(int now,int aid)
{
if(WUXIE(now,aid))
return ;
int who=0;
Card *x;
while(1)
{
who^=1;
if(who)
{
x=p[aid].have_sha();
if(x==NULL)
{
get_hurt(now,aid);
break;
}
else
p[aid].del(x);
}
else
{
x=p[now].have_sha();
if(x==NULL)
{
get_hurt(aid,now);
break;
}
else
p[now].del(x);
}
}
}
inline void FPF(int now)
{
judge_attack(now,1);
FPF2(now,1);
}
inline void FP(int now)
{
int nowp,attacknum=0;
for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
{
if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
if(v(x)=='K'&&(!attacknum||p[now].ifz))
{
nowp=pnxt[now];
if(p[nowp].zhong||p[nowp].id==0)
++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
}
if(v(x)=='F')p[now].del(x),FPF(now),x=p[now].fi;
if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;
if(!p[now].live)
break;
}
}
inline void is_FP(int now)
{
p[now].get_card(2);
FP(now);
}
void work()
{
nowcard=0;
int now=1;
for(int i=1;;++i)
{
if(p[now].id==0) is_MP(now);
else if(p[now].id==1) is_ZP(now);
else is_FP(now);
now=pnxt[now];
}
}
// 0_MP 1_ZP 2_FP
// P桃 K杀 D闪 F决斗 N南蛮 W万箭 J无懈 Z诸葛
int main(){
//freopen("in.in","r",stdin);
//freopen("kopk.in","r",stdin);
//freopen("kopk.out","w",stdout);
//freopen("out.out","w",stdout);
n=read();m=read();
yuann=n;
for(int i=1;i<=n;++i)
{
p[i].chu();
scanf("%s",s);
if(s[0]=='M')
p[i].id=0;
else
if(s[0]=='Z')
p[i].id=1;
else
{
++numfan;
p[i].id=2;
}
for(int j=1;j<=4;++j)
{
scanf("%s",s);
p[i].add(s[0]);
}
ppre[i]=i-1;
pnxt[i]=i+1;
}
ppre[1]=n;
pnxt[n]=1;
for(int i=1;i<=m;++i)
{
scanf("%s",s);
c[i]=s[0];
pre[i]=i-1;
nxt[i]=i+1;
}
nxt[0]=1;nxt[m]=m;
work();
}