社区讨论

求大佬指出错因(70分了)

P2482[SDOI2010] 猪国杀参与者 9已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lo8o1td2
此快照首次捕获于
2023/10/27 21:45
2 年前
此快照最后确认于
2023/10/27 21:45
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct renwu
{
	int character,health,l,r;
	char card[2001];
	queue<int>d,j;
	bool jump,z,k,fakeJump;
}a[11];
int n,m,f,now,sum;
char cardForever;
bool b[11],youxijieshu;
void getCard(int o)
{
	if(sum==m+4*n)
	{
		a[o].r++;
		a[o].card[a[o].r]=cardForever;
		return ;
	}
	char c;
	cin>>c;
	sum++;
	if(sum==m+4*n)
	{
		cardForever=c;
	}
	a[o].r++;
	if(c=='D')
	{
		a[o].d.push(a[o].r);
	}
	if(c=='J')
	{
		a[o].j.push(a[o].r);
	}
	a[o].card[a[o].r]=c;
}
void dead(int o,int p)
{
	for(int i=1;i<=a[p].r;i++)
	{
		if(a[p].card[i]=='P')
		{
			a[p].card[i]='0';
			a[p].health++;
			return ;
		}
	}
	if(a[p].character==3)
	{
		f--;
		if(f==0)
		{
			b[p]=0;
			return ;
		}
		for(int i=1;i<=3;i++)
		{
			getCard(o);
		}
	}
	if(a[o].character==1&&a[p].character==2)
	{
		a[o].l=a[o].r=0;
		a[o].z=0;
	}
	b[p]=0;
}
bool nothingToBreak(int o,int p,bool q)
{
	int k=o;
	do
	{
		if(b[k]==0||q==1&&!((a[k].character==1&&a[p].character==2)||(a[p].character==1&&a[k].character==2)||a[k].character==a[p].character)||q==0&&((a[k].character==1&&a[p].character==2)||(a[p].character==1&&a[k].character==2)||a[k].character==a[p].character))
		{
			k++;
			if(k>n)
			{
				k=1;
			}
			if(k==o)
			{
				break;
			}
			continue;
		}
		if(!a[k].j.empty())
		{
			a[k].card[a[k].j.front()]='0';
			a[k].j.pop();
			a[k].jump=1;
			if(!nothingToBreak(k,p,!q))
			{
				return 1;
			}
		}
		k++;
		if(k>n)
		{
			k=1;
		}
	}while(k!=o);
	return 0;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		if(s[0]=='M')
		{
			a[i].character=1;
		}
		if(s[0]=='Z')
		{
			a[i].character=2;
		}
		if(s[0]=='F')
		{
			a[i].character=3;
			f++;
		}
		for(int j=1;j<=4;j++)
		{
			getCard(i);
		}
		b[i]=1;
		a[i].health=4;
		a[i].l=1;
	}
	a[1].jump=1;
	now=0;
	while(b[1]&&f>0)
	{
		now++;
		if(now>n)
		{
			now=1;
		}
		while(b[now]==0)
		{
			if(now>n)
			{
				now=0;
			}
			now++;
		}
		for(int j=1;j<=2;j++)
		{
			getCard(now);
		}
		a[now].k=1;
		while(a[now].card[a[now].l]=='0')
		{
			a[now].l++;
		}
		for(int i=a[now].l;i<=a[now].r;i++)
		{
			if(a[now].card[i]=='K')
			{
				int j=now+1;
				while(b[j]==0)
				{
					if(j>n)
					{
						j=0;
					}
					j++;
				}
				if(a[now].k==0||a[j].jump==0&&!(a[now].character==1&&a[j].fakeJump==1)||a[j].jump==1&&((a[now].character==1&&a[j].character==2)||(a[now].character==2&&a[j].character==1)||a[now].character==a[j].character))
				{
					continue;
				}
				a[now].card[i]='0';
				a[now].jump=1;
				if(!a[now].z)
				{
					a[now].k=0;
				}
				if(a[j].d.empty())
				{
					a[j].health--;
				}
				else
				{
					a[j].card[a[j].d.front()]='0';
					a[j].d.pop();
				}
				if(a[j].health<=0)
				{
					dead(now,j);
				}
			}
			if(a[now].card[i]=='F')
			{
				int j;
				if(a[now].character==3)
				{
					j=1;
				}
				else
				{
					j=now+1;
					while(b[j]==0||a[j].jump==0&&!(a[now].character==1&&a[j].fakeJump==1)||a[j].jump==1&&((a[now].character==1&&a[j].character==2)||(a[now].character==2&&a[j].character==1)||a[now].character==a[j].character))
					{
						if(j>n)
						{
							j=0;
						}
						j++;
						if(j==now)
						{
							break;
						}
					}
				}
				if(j==now)
				{
					continue;
				}
				a[now].card[i]='0';
				a[now].jump=1;
				if(a[j].jump==1)
				{
					if(nothingToBreak(now,j,1))
					{
						continue;
					}
				}
				int u=1,v=1;
				if(a[now].character==1&&a[j].character==2)
				{
					a[j].health--;
				}
				else
				{
					while(1)
					{
						while(u<=a[j].r)
						{
							if(a[j].card[u]=='K')
							{
								a[j].card[u]='0';
								break;
							}
							u++;
						}
						if(u>a[j].r)
						{
							a[j].health--;
							break;
						}
						while(v<=a[now].r)
						{
							if(a[now].card[v]=='K')
							{
								a[now].card[v]='0';
								break;
							}
							v++;
						}
						if(v>a[now].r)
						{
							a[now].health--;
							break;
						}
					}
				}
				if(a[now].health<=0)
				{
					dead(j,now);
				}
				if(a[j].health<=0)
				{
					dead(now,j);
				}
			}
			if(a[now].card[i]=='N')
			{
				a[now].card[i]='0';
				for(int j=now+1;j!=now;j++)
				{
					if(j>n)
					{
						j=1;
					}
					if(j==now)
					{
						break;
					}
					if(b[j]==0)
					{
						continue;
					}
					if(a[j].jump==1)
					{
						if(nothingToBreak(now,j,1))
						{
							continue;
						}
					}
					for(int k=1;k<=a[j].r;k++)
					{
						if(a[j].card[k]=='K')
						{
							a[j].card[k]='0';
							break;
						}
						if(k==a[j].r)
						{
							a[j].health--;
							if(a[j].character==1)
							{
								a[now].fakeJump=1;
							}
						}
					}
					if(a[j].health<=0)
					{
						dead(now,j);
						if(b[1]==0||f==0)
						{
							youxijieshu=1;
							break;
						}
					}
				}
			}
			if(a[now].card[i]=='W')
			{
				a[now].card[i]='0';
				for(int j=now+1;j!=now;j++)
				{
					if(j>n)
					{
						j=1;
					}
					if(j==now)
					{
						break;
					}
					if(b[j]==0)
					{
						continue;
					}
					if(a[j].jump==1)
					{
						if(nothingToBreak(now,j,1))
						{
							continue;
						}
					}
					if(a[j].d.empty())
					{
						a[j].health--;
						if(a[j].character==1)
						{
							a[now].fakeJump=1;
						}
					}
					else
					{
						a[j].card[a[j].d.front()]='0';
						a[j].d.pop();
					}
					if(a[j].health<=0)
					{
						dead(now,j);
						if(b[1]==0||f==0)
						{
							youxijieshu=1;
							break;
						}
					}
				}
			}
			if(a[now].card[i]=='Z')
			{
				a[now].card[i]='0';
				if(a[now].z==0)
				{
					i=a[now].l;
				}
				a[now].z=1;
			}
			if(a[now].card[i]=='P'&&a[now].health<4)
			{
				a[now].card[i]='0';
				a[now].health++;
			}
			if(b[1]==0||f==0)
			{
				youxijieshu=1;
				break;
			}
			if(b[now]==0)
			{
				break;
			}
		}
	}
	if(b[1]==0)
	{
		cout<<"FP"<<endl;
	}
	else
	{
		cout<<"MP"<<endl;
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]==0)
		{
			cout<<"DEAD"<<endl;
			continue;
		}
		while(a[i].l<=a[i].r&&a[i].card[a[i].l]<'A'||a[i].card[a[i].l]>'Z')
		{
			a[i].l++;
		}
		if(a[i].l>a[i].r)
		{
			cout<<endl;
			continue;
		}
		int j=a[i].l;
		cout<<a[i].card[j];
		while(j<=a[i].r)
		{
			j++;
			if(a[i].card[j]<'A'||a[i].card[j]>'Z')
			{
				continue;
			}
			cout<<" "<<a[i].card[j];
		}
		cout<<endl;
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...