测试点1
Wrong Answer. wrong answer On line 3 column 9, read (ASCII 13), expected D.
我在DEV里运行并没有错呀
附代码
#include<bits/stdc++.h>
using namespace std;
int n,m,xl[11],fw[11][2],FP,d;
char zsf[11],sf[11];
string x,sp[11],pd;
bool zgln[11],ed;
void mp(int x)//摸牌
{
sp[x]+=pd[d++];
if(d==m)
--d;
}
void dead(int x,int to)//死亡判断
{
for(int i=0;i<sp[to].size();++i)
if(sp[to][i]=='P')
{
sp[to][i]='*';
++xl[to];
return;
}//有没有桃
fw[fw[to][0]][1]=fw[to][1];
fw[fw[to][1]][0]=fw[to][0];//更改攻击范围
if(to==1)
{
ed=true;
return;
}
if(sf[to]=='F')
--FP;
if(!FP)
{
ed=true;
return;
}
if(sf[to]=='F')
mp(x),mp(x),mp(x);//击杀反猪摸牌
if(sf[x]=='M'&&sf[to]=='Z')
{
for(int i=0;i<sp[x].size();++i)
sp[x][i]='*';
zgln[x]=false;
}//主猪击杀忠猪弃掉所有牌
}
void Kill(int x,int to)//杀
{
for(int i=0;i<sp[to].size();++i)
if(sp[to][i]=='D')
{
sp[to][i]='*';
return;
}//有没有闪
--xl[to];//扣血
if(!xl[to])
dead(x,to);//是否死亡
}
bool wxkj(int x,int to,int y)//无懈可击,0为献殷勤,1为表敌意
{
int nxt=x;
while(1)
{
if(y==1)
{
if(sf[nxt]==zsf[to]||sf[nxt]=='Z'&&sf[to]=='M'||sf[nxt]=='M'&&zsf[to]=='Z')//要不要用
{
for(int i=0;i<sp[nxt].size();++i)
if(sp[nxt][i]=='J')
{
zsf[nxt]=sf[nxt];
sp[nxt][i]='*';
return !wxkj(nxt,x,0);//有人表敌意结果相反
}
}
}else
{
if((sf[nxt]=='M'||sf[nxt]=='Z')&&zsf[to]=='F'||sf[nxt]=='F'&&(zsf[to]=='M'||zsf[to]=='Z'))
{
for(int i=0;i<sp[nxt].size();++i)
if(sp[nxt][i]=='J')
{
zsf[nxt]=sf[nxt];
sp[nxt][i]='*';
return !wxkj(nxt,x,0);//有人表敌意结果相反
}
}
}
nxt=fw[nxt][1];
if(nxt==x)
break;
}
return false;
}
void nzrq(int x)//南猪入侵
{
for(int i=fw[x][1];i!=x;i=fw[i][1])
if(!wxkj(x,i,1))
{
for(int j=1;j<=sp[i].size();++j)
if(sp[i][j]=='K')
{
sp[i][j]='*';
return;
}
--xl[i];
if(i==1&&zsf[x]=='N')
zsf[x]='L';
if(!xl[i])
dead(x,i);
if(ed)
return;
}
}
void wjqf(int x)//万箭齐发
{
for(int i=fw[x][1];i!=x;i=fw[i][1])
if(!wxkj(x,i,1))
{
for(int j=1;j<=sp[i].size();++j)
if(sp[i][j]=='D')
{
sp[i][j]='*';
return;
}
--xl[i];
if(i==1&&zsf[x]=='N')
zsf[x]='L';
if(!xl[i])
dead(x,i);
if(ed)
return;
}
}
void jd(int x,int to)
{
if(wxkj(x,to,1))
return;
if(sf[x]=='M'&&sf[to]=='Z')
{
--xl[to];
if(!xl[to])
dead(x,to);
return;
}
int c=0,c1=0;
while(1)
{
while(sp[to][c]!='K'&&c<=sp[to].size())
++c;
if(c>sp[to].size())
{
--xl[to];
if(!xl[to])
dead(x,to);
return;
}else
sp[to][c]='*';
while(sp[x][c1]!='K'&&c1<=sp[x].size())
c1++;
if(c1>sp[x].size())
{
xl[x]--;
if(!xl[x])
dead(to,x);
return;
}else
sp[x][c1]='*';
}
}
void play()
{
if(!FP)
ed=true;
if(ed)
return;
for(int i=1;i;i=fw[i][1])
{
bool K=false;//是否用过杀
int nxt=fw[i][1];//下一位
mp(i);mp(i);//摸牌
for(int j=0;j<sp[i].size();++j)
if(sp[i][j]!='*')//*为已经用过
{
char l=sp[i][j];
if(zgln[i])
K=false;
if(l=='Z')//猪哥连弩
{
zgln[i]=true;
sp[i][j]='*';
j=-1;
}
if(l=='P')//桃
if(xl[i]!=4)
++xl[i],sp[i][j]='*';
if(l=='K')//杀
{
if(K)//还能不能使用杀
continue;
if(sf[i]=='M'&&zsf[nxt]!='L'&&zsf[nxt]!='F')
continue;
if(sf[i]=='Z'&&zsf[nxt]!='F')
continue;
if(sf[i]=='F'&&zsf[nxt]!='M'&&zsf[nxt]!='Z')
continue;//有无对象使用杀
sp[i][j]='*';
Kill(i,nxt);
zsf[i]=sf[i];
K=true;
if(ed)
return;
}
if(l=='N')//南猪入侵
{
sp[i][j]='*';
nzrq(i);
if(ed)
return;
}
if(l=='W')//万箭齐发
{
sp[i][j]='*';
wjqf(i);
if(ed)
return;
}
if(l=='F')
{
if(sf[i]=='F')
{
sp[i][j]='*';
jd(i,1);
zsf[i]=sf[i];
if(ed)
return;
}else
{
for(int k=fw[i][1];k!=i;k=fw[k][1])
if(sf[i]=='M'&&(zsf[k]=='F'||zsf[k]=='L')||sf[i]=='Z'&&zsf[k]=='F')
{
sp[i][j]='*';
jd(i,k);
zsf[i]=sf[i];
if(ed)
return;
}
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>x;
if(x=="MP")
sf[i]='M';else//主猪
if(x=="ZP")
sf[i]='Z';else//忠猪
sf[i]='F',++FP;//反猪
getline(cin,x);
for(int j=0;j<x.size();++j)
if(x[j]!=' ')
sp[i]+=x[j];//手牌
xl[i]=4;//血量
fw[i][0]=i-1;
fw[i][1]=i+1;
zsf[i]='N';//主猪眼中身份,N未知,F反猪,Z忠猪,M主猪,L类反猪
}
zsf[1]='M';
fw[1][0]=n;
fw[n][1]=1;
getline(cin,x);
for(int i=0;i<x.size();++i)
if(x[i]!=' ')
pd+=x[i];//牌堆
play();
if(!xl[1])
cout<<"FP"<<'\n';else
cout<<"MP"<<'\n';//哪方胜利(主猪有没有挂)
for(int i=1;i<=n;++i)
{
if(xl[i]<=0)
cout<<"DEAD"<<'\n';else//这只猪挂了
{
for(int j=0;j<sp[i].size();++j)
if(sp[i][j]!='*')
cout<<sp[i][j]<<" ";//没用过就输出
cout<<'\n';
}
}
}