怎么回事
查看原帖
怎么回事
432126
s_cenxinyang楼主2021/10/6 12:58

测试点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'; 
		  }
	}
}
2021/10/6 12:58
加载中...