rt
我去linux也跑了一遍,跑的飞快,为什么T了。
#include<bits/stdc++.h>
using namespace std;
int n,m;
queue<char>q;//牌堆
string c[101];//手牌
int nam[101];//身份
int hp[101];//血量
bool zg[101];//是否有诸葛
int sn[101];//闪数量
int sa[101];//杀数量
int zt[101];//-2类反 -1反 0无 1忠
int fz;//反猪数量
void mopai(int nw,int num)//摸牌
{
for(int i=0;i<num;i++){
char x=q.front();
c[nw]+=x;
if(x=='K')sa[nw]++;
if(x=='D')sn[nw]++;
q.pop();
if(q.empty())q.push(x);
}
return;
}
bool check(char ch,int nw){
return ch=='K'||ch=='P'&&hp[nw]<4||ch=='F'||ch=='N'||ch=='W'||ch=='Z';
}
int dis[101];//距离
bool ded[101];//是否死亡
void jiesuan(int x)//结算
{
if(x==-1){
printf("FP\n");
}
else printf("MP\n");
for(int i=1;i<=n;i++){
if(ded[i]){
printf("DEAD\n");
continue;
}
else{
for(int j=0;j<c[i].size();j++){
char p=c[i][j];
printf("%c",p);
if(j!=c[i].size()-1)putchar(' ');
}
putchar('\n');
}
}
exit(0);
}
int dd;
void kil(int nw,int i){//nw干掉了i
ded[i]=1;
dd--;
if(nam[i]==0)jiesuan(-1);
if(nam[nw]==0&&nam[i]==1){
zg[nw]=sa[nw]=sn[nw]=0;
c[nw].clear();
}
else if(nam[i]==-1){
mopai(nw,3);
fz--;
if(fz==0)jiesuan(1);
}
for(int j=i-1;j;j--)dis[j]--;
return;
}
void wuxie(int i,int j,bool &use){
if((int)c[i].find("J")==-1)return;
if(use){
if(nam[i]>=0&&zt[j]==1){
use^=1;
zt[i]=1;
c[i].erase(c[i].find('J'));
}
if(nam[i]==-1&&zt[j]==-1){
use^=1;
zt[i]=-1;
c[i].erase(c[i].find('J'));
}
}
else{
if(nam[i]==0&&zt[j]<=-1||nam[i]==1&&zt[j]==-1){
use^=1;
zt[i]=1;
c[i].erase(c[i].find('J'));
}
else if(nam[i]==-1&&zt[j]==1){
use^=1;
zt[i]=-1;
c[i].erase(c[i].find('J'));
}
}
return;
}
void use1(int x,bool p)//0-万剑 1-南猪
{
for(int step=1;step<n;step++){
int i=(x+step-1)%n+1;
if(x==i)continue;
if(ded[i])continue;
bool use=1,xian=0;
for(int stp=0;stp<n;stp++){
int j=(i+stp-1)%n+1;
wuxie(j,i,use);
}
if(!use)continue;
if(p){
if(sa[i]){
sa[i]--;
c[i].erase(c[i].find("K"),1);
}
else{
hp[i]--;
if(nam[i]==0&&zt[x]==0)zt[x]=-2;
if(hp[i]==0&&(int)c[i].find("P")!=-1){
c[i].erase(c[i].find("P"),1);
hp[i]++;
}
else if(hp[i]==0){
kil(x,i);
}
}
}
else{
if(sn[i]){
sn[i]--;
if(nam[i]==0&&zt[x]==0)zt[x]=-2;
c[i].erase(c[i].find("D"),1);
}
else{
hp[i]--;
if(hp[i]==0&&(int)c[i].find("P")!=-1){
c[i].erase(c[i].find("P"),1);
hp[i]++;
}
else if(hp[i]==0){
kil(x,i);
}
}
}
}
}
int fd(int nw,int p){
if(nam[nw]==-1){
for(int i=1;i<=n;i++){
if(i==nw)continue;
if((dis[nw]-dis[i]+dd)%dd>1&&p==1)continue;
if(nam[i]==0)return i;
}
return -1;
}
if(p==-1){
for(int i=1;i<=n;i++){
if(i==nw)continue;
// if((dis[nw]-dis[i]+dd)%dd>1)continue;
if(zt[i]==1&&nam[nw]==-1)return i;
if(zt[i]<0&&nam[nw]==0)return i;
if(zt[i]==-1&&nam[nw]==1)return i;
}
return -1;
}
for(int i=1;i<=n;i++){
if(i==nw)continue;
if((dis[nw]-dis[i]+dd)%dd>1)continue;
if(nam[nw]==0){
if(zt[i]<0)return i;
}
else{
if(zt[i]==-1&&nam[nw]==1||zt[i]==1&&nam[nw]==-1){
return i;
}
}
}
return -1;
}
void juedou(int a,int b)//决斗
{
if(zt[a]==1)zt[b]=-1;
if(zt[a]==-1)zt[b]=1;
bool use=1;
for(int stp=0;stp<n;stp++){
int j=(a+stp-1)%n+1;
wuxie(j,a,use);
}
if(!use)return;
if(nam[a]==1&&nam[b]==0){
hp[a]--;
if(hp[a]==0&&(int)c[a].find("P")!=-1){
c[a].erase(c[a].find("P"),1);
hp[a]++;
}
else if(hp[a]==0){
kil(b,a);
}
return;
}
bool nw=1;
while(1){
if(nw){
if(sa[a]){
sa[a]--;
c[a].erase(c[a].find("K"),1);
}
else{
hp[a]--;
if(hp[a]==0&&(int)c[a].find("P")!=-1){
c[a].erase(c[a].find("P"),1);
hp[a]++;
}
else if(hp[a]==0){
kil(b,a);
}
return;
}
}
else{
if(sa[b]){
sa[b]--;
c[b].erase(c[b].find("K"),1);
}
else{
hp[b]--;
if(hp[b]==0&&(int)c[b].find("P")!=-1){
c[b].erase(c[b].find("P"),1);
hp[b]++;
}
else if(hp[b]==0){
kil(a,b);
}
return;
}
}
nw^=1;
}
}
int roud;
void ssa(int x,int y){
if(zt[y]==-1)zt[x]=1;
if(zt[y]==1)zt[x]=-1;
if((int)c[y].find("D")!=-1){
sn[y]--;
// printf("%d : %d:",roud,y);
// for(int i=0;i<c[y].size();i++)printf("%c ",c[y][i]);
// putchar('\n');
c[y].erase(c[y].find("D"),1);
}
else{
hp[y]--;
if(hp[y]==0&&(int)c[y].find("P")!=-1){
c[y].erase(c[y].find("P"),1);
hp[y]++;
}
else if(hp[y]==0){
kil(x,y);
}
}
}
int main(){
// freopen("1.in","r",stdin);
// freopen("2.out","w",stdout);
// scanf("%d%d",&n,&m);
cin>>n>>m;
dd=n;
for(int i=1;i<=n;i++){
char ch1,ch2;hp[i]=4;
dis[i]=n-i;
scanf("%c",&ch1);
while(ch1==' '||ch1=='\n')scanf("%c",&ch1);
scanf("%c",&ch2);
if(ch1=='M'&&ch2=='P')nam[i]=0,zt[i]=1;//主
if(ch1=='Z'&&ch2=='P')nam[i]=1;//忠
if(ch1=='F'&&ch2=='P')nam[i]=-1,fz++;//反
for(int j=1;j<=4;j++){
char chh;
chh=getchar();
while(chh==' '||chh=='\n')chh=getchar();
if(chh=='K')sa[i]++;
if(chh=='D')sn[i]++;
c[i]+=chh;
}
}
for(int i=1;i<=m;i++){
char ch=getchar();
while(ch==' '||ch=='\n')ch=getchar();
q.push(ch);
}
int nw=1;
for(int i=1;i<=n;i++)if(nam[i]==0)nw=i;
while(!q.empty()){
if(nw==1)roud++;
if(ded[nw]){
nw++;
nw=(nw-1)%n+1;
continue;
}
mopai(nw,2);
int flag=0;
for(int i=0;i<c[nw].size();i++){
if(check(c[nw][i],nw)){
if(c[nw][i]=='P'){
c[nw].erase(i,1);
hp[nw]++;
i--;
continue;
}
if(c[nw][i]=='Z'){
zg[nw]=1;
c[nw].erase(i,1);
i--;
continue;
}
if(c[nw][i]=='N'||c[nw][i]=='W'){
char p=c[nw][i];
c[nw].erase(i,1);
use1(nw,p=='N');
i--;
continue;
}
if(c[nw][i]=='F'){
int x=fd(nw,-1);
if(x!=-1){
c[nw].erase(i,1);
juedou(x,nw);
i--;
}
continue;
}
if(c[nw][i]=='K'&&(flag==0||zg[nw])){
int x=fd(nw,1);
flag++;
if(x!=-1){
sa[nw]--;
c[nw].erase(i,1);
ssa(nw,x);
i--;
}
continue;
}
}
}
nw++;
nw=(nw-1)%n+1;
}
}