MLE+WA+TLE QWQ
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int playing; //正在执行回合的人
string paidui; //牌堆
int n,m; //玩家数和牌堆中牌的数量
int paiduishu; //牌堆中牌的数量
int top=-1; //牌堆顶指针
int fanshu; //反猪数量
struct Pig{
string cards; //手牌
int role; //身份:1.主猪;2.忠猪;3.反猪
int seem; //跳的身份:0:没跳; 1:类反; 2:忠; 3:反;
int hp; //剩余体力
bool dead; //是否死亡
bool wuqi; //是否装了连弩
bool sha; //是否使用过杀
bool pai; //是否使用过牌
void mopai() //摸牌函数
{
for(int i=1;i<=2;i++)
{
if(top<m) top++;
cards.push_back(paidui[top]);
}
}
}pig[11];
void gameover()
{
if(pig[1].dead)
{
printf("FP\n");
for(int i=1;i<=n;i++)
{
if(pig[i].dead)
{
if(i==n) printf("DEAD");
else printf("DEAD\n");
continue;
}
for(int j=0;j<pig[i].cards.size();j++)
printf("%c ",pig[i].cards[j]);
if(i==n) break;
printf("\n");
}
exit(0);
}
if(fanshu==0)
{
printf("MP\n");
for(int i=1;i<=n;i++)
{
if(pig[i].dead)
{
if(i==n) printf("DEAD");
else printf("DEAD\n");
continue;
}
cout<<pig[i].cards[0];
for(int j=1;j<pig[i].cards.size();j++)
printf(" %c",pig[i].cards[j]);
if(i==n) break;
printf("\n");
}
exit(0);
}
}
void readd()
{
paiduishu=m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
pig[i].hp=4;
string x;
cin>>x;
if(x=="MP") {pig[i].role=1;pig[i].seem=2;}
else if(x=="ZP") pig[i].role=2;
else if(x=="FP")
{
pig[i].role=3;
fanshu++;
}
// else printf("身份错误!!");
string xx;
for(int j=1;j<=4;j++)
{
cin>>xx;
pig[i].cards.push_back(xx[0]);
}
}
string xx;
for(int i=1;i<=m;i++)
{
cin>>xx;
paidui.push_back(xx[0]);
}
if(fanshu==0)
{
gameover();
}
}
bool shiyong(int shi,char yongpai)
{
int paizhizhen=-1;
// printf("正在使用%c\n",yongpai);
paizhizhen=pig[shi].cards.find(yongpai);
if(paizhizhen==-1)
{
// printf("没有使用\n");
return 0;
}
pig[shi].cards.erase(paizhizhen,1);
// printf("使用\n");
return 1;
}
void binsi(int shi,int bei)
{
if(pig[bei].hp<1)
if(shiyong(bei,'P'))
pig[bei].hp++;
if(pig[bei].hp<1)
{
if(pig[bei].role==3)
{
pig[bei].cards="";
pig[bei].wuqi=0;
fanshu--;
pig[bei].dead=true;
gameover();
pig[shi].mopai();
pig[shi].mopai();
pig[shi].mopai();
}
if(pig[bei].role==2 && pig[shi].role==1)
{
pig[shi].cards="";
pig[shi].wuqi=0;
pig[bei].cards="";
pig[bei].wuqi=0;
pig[bei].dead=true;
}
if(pig[bei].role==1)
{
pig[bei].cards="";
pig[bei].wuqi=0;
pig[bei].dead=true;
gameover();
}
}
}
void juedou(int shi,int bei)
{
// printf("pig[%d]与pig[%d]决斗\n",shi,bei);
if(pig[bei].role==2 && pig[shi].role==1)
{
pig[bei].hp--;
// printf("忠臣pig[%d]没有响应决斗,当前血量为%d\n",bei,pig[bei].hp);
if(pig[bei].hp<1) binsi(shi,bei);
return;
}
if(shiyong(bei,'K')) juedou(bei,shi);
else
{
pig[bei].hp--;
if(pig[bei].hp<1) binsi(shi,bei);
return;
}
}
bool wuxie(int shi)
{
bool di_or_not;
bool flag;
for(int i=shi+1;;i++)
{
if(i>n)
{
i=1;
flag=true;
}
if(flag && i==shi) break;
if(pig[i].dead) continue;
if(pig[shi].role!=pig[i].role)
{
if(shiyong(i,'J'));
if(wuxie(i))
{
di_or_not=true;
break;
}
}
}
if(di_or_not) return 0;
return 1;
}
void nan(int shi)
{
for(int i=1;i<=n;i++)
{
if(i==shi) continue;
bool wuxie_or_not;
if(!pig[i].dead && i!=shi)
if(pig[i].seem!=0)
{
bool flag=false;
for(int j=shi;;j++)
{
if(j>n)
{
j=1;
flag=true;
}
if(flag && j==shi) break;
if(pig[j].dead) continue;
if((pig[j].role==pig[i].seem && pig[i].seem!=1) || (pig[j].role==1 && pig[i].seem==2))
if(shiyong(j,'J'))
{
pig[j].seem=pig[i].seem;
if(wuxie(j))
{
wuxie_or_not=true;
break;
}
}
}
}
if(wuxie_or_not) continue;
if(!shiyong(i,'K'))
{
pig[i].hp--;
// printf("pig[%d]没有响应南蛮入侵\n当前血量为:%d\n",i,pig[i].hp);
if(pig[i].role==1 && pig[shi].seem==0)
pig[shi].seem=1;
}
if(pig[i].hp<1) binsi(shi,i);
}
}
void wan(int shi)
{
for(int i=1;i<=n;i++)
{
if(i==shi) continue;
bool wuxie_or_not;
if(!pig[i].dead)
if(pig[i].seem!=0)
{
bool flag=false;
for(int j=shi;;j++)
{
if(j>n)
{
j=1;
flag=true;
}
if(flag && j==shi) break;
if(pig[j].dead) continue;
if((pig[j].role==pig[i].seem && pig[i].seem!=1) || (pig[j].role==1 && pig[i].seem==2))
if(shiyong(j,'J'))
{
pig[j].seem=pig[i].seem;
if(wuxie(j))
{
wuxie_or_not=true;
break;
}
}
}
}
if(wuxie_or_not) continue;
if(!shiyong(i,'D'))
{
pig[i].hp--;
// printf("pig[%d]没有响应万箭齐发\n当前血量为:%d\n",i,pig[i].hp);
if(pig[i].role==1 && pig[shi].seem==0)
pig[shi].seem=1;
}
if(pig[i].hp<1) binsi(shi,i);
}
}
int findjue(int shi)
{
int ans=-1;
if(pig[shi].role==3)
{
ans=1;
pig[shi].seem=3;
}
if(pig[shi].role==1)
{
bool flag;
for(int i=shi;;i++)
{
if(i>n)
{
i=1;
flag=true;
}
if(i==shi && flag) break;
if(pig[i].dead) continue;
if(pig[i].seem==1 || pig[i].seem==3)
{
ans=i;
// printf("ans=%d\n",ans);
return ans;
}
}
}
if(pig[shi].role==2)
{
bool flag;
for(int i=shi;;i++)
{
if(i>n)
{
i=1;
flag=true;
}
if(i==shi && flag) break;
if(pig[i].dead) continue;
if(pig[i].seem==3)
{
ans=i;
pig[shi].seem=2;
break;
}
}
}
return ans;
}
bool juexiao(int shi,int bei)
{
bool wuxie_or_not;
if(pig[bei].seem!=0)
{
bool flag;
for(int j=shi+1;;j++)
{
if(j>n)
{
flag=true;
j=1;
}
if(j==shi && flag) break;
if(pig[j].dead) continue;
if(pig[j].role==pig[bei].role)
if(shiyong(j,'J'))
{
pig[j].seem=pig[bei].seem;
if(wuxie(j))
{
wuxie_or_not=true;
break;
}
}
}
}
// cout<<wuxie_or_not<<endl;
if(wuxie_or_not) return 0;
return 1;
}
int shaxiao(int shi)
{
bool flag;
int ans=shi+1;
for(int i=shi+1;;i++)
{
if(i>n)
{
i=1;
flag=true;
}
if(i==shi) break;
if(!pig[i].dead)
{
ans=i;
break;
}
}
if(pig[shi].role==1 && pig[ans].seem!=pig[shi].seem) return 1;
if(pig[shi].role==2 && pig[ans].seem==3) return 1;
if(pig[shi].role==3 && pig[ans].seem!=pig[shi].seem) return 1;
return -1;
}
void sha(int shi,int bei)
{
if(pig[bei].seem==3) pig[shi].seem=2;
if(pig[bei].seem==2) pig[shi].seem=3;
if(!shiyong(bei,'D')) pig[bei].hp--;
if(pig[bei].hp<1) binsi(shi,bei);
}
int main()
{
readd();
while(1)
{
playing++;
if(playing>n) playing=1;
if(pig[playing].dead) continue;
pig[playing].sha=false;
pig[playing].mopai();
while(1)
{
pig[playing].pai=false;
for(int i=0;i<pig[playing].cards.size();i++)
{
// if(pig[playing].cards[i]=='D') continue;
if(pig[playing].cards[i]=='P' && pig[playing].hp<4)
{
pig[playing].cards.erase(i,1);
pig[playing].pai=true;
pig[playing].hp++;
// printf("pig[%d]使用了一个桃\n当前血量为:%d",playing,pig[playing].hp);
}
if(pig[playing].cards[i]=='Z')
{
pig[playing].cards.erase(i,1);
pig[playing].wuqi=true;
pig[playing].pai=true;
// printf("pig[%d]装上了诸葛连弩\n",playing);
}
if(pig[playing].cards[i]=='N')
{
pig[playing].cards.erase(i,1);
// printf("pig[%d]打出了一张南蛮入侵\n",playing);
nan(playing);
pig[playing].pai=true;
}
if(pig[playing].cards[i]=='W')
{
pig[playing].cards.erase(i,1);
// printf("pig[%d]打出了一张万箭齐发\n",playing);
wan(playing);
pig[playing].pai=true;
}
if(pig[playing].cards[i]=='F')
{
int beijue=findjue(playing);
if(beijue==-1) continue;
pig[playing].cards.erase(i,1);
pig[playing].pai=true;
if(juexiao(playing,beijue))
juedou(playing,beijue);
}
if(pig[playing].cards[i]=='K' && shaxiao(playing)!=-1)
{
if(!pig[playing].sha || pig[playing].wuqi)
{
pig[playing].cards.erase(i,1);
pig[playing].pai=true;
sha(playing,shaxiao(playing));
pig[playing].sha=true;
}
}
// cout<<pig[playing].cards<<endl;
if(pig[playing].pai) break;
}
if(!pig[playing].pai) break;
if(pig[playing].hp<1) break;
}
}
}