会有人帮忙看下我的猪国杀吗...几乎全错
查看原帖
会有人帮忙看下我的猪国杀吗...几乎全错
771117
lts080812楼主2024/11/8 16:45
#include<bits/stdc++.h>
using namespace std;
#define attack pppppp
#define what ifp
#define whel ifp
#define whno ifp
#define whre ifp
#define ENT int b=0;for(int j=1;b!=n;j=max(1,(j+1)%(n+1)),b++)
#define LNT int kk=0;for(int i=max(1,(x+1)%(n+1));kk!=n;i=max(1,(i+1)%(n+1)),kk++)

int nowp[12][2020],pdaw[2020],head[12],tail[12],nowpdaw=0,passio[12],jum[12],jow[12],zhuge[12],lif[12],blood[12];
int attac[12],elude[12],rescu[12],noeff[12],ifp[12][2020];//what[12][2020],whel[12][2020],whre[12][2020],whno[12][2020],
//杀1,闪2,桃3,决斗4,南蛮5,万箭6,无懈7,诸葛8
//主公1,忠臣2,反贼3,类反4
bool ifhavef;
int n,m,whilend=0;

inline int read()
{
	char ch=getchar();
	while(ch<'A'||ch>'Z')ch=getchar();
	if(ch=='M'){getchar();return -1;}
	if(ch=='Z'){ch=getchar();if(ch=='P')return -2;else return 8;}
	if(ch=='F'){ch=getchar();if(ch=='P')return -3;else return 4;}
	if(ch=='K')return 1;
	if(ch=='D')return 2;
	if(ch=='P')return 3;
	if(ch=='N')return 5;
	if(ch=='W')return 6;
	if(ch=='J')return 7;
}

void init()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		head[i]=1;tail[i]=4;jum[i]=0;jow[i]=0;zhuge[i]=0;lif[i]=1;blood[i]=4;
		attac[i]=elude[i]=rescu[i]=noeff[i]=0;
	}
	for(int i=1;i<=n;i++)
	{
		passio[i]=abs(read());
		for(int j=1;j<=4;j++)
		{
			nowp[i][j]=read();
			if(nowp[i][j]==1)attac[i]++;
			if(nowp[i][j]==2)elude[i]++;
			if(nowp[i][j]==3)rescu[i]++;
			if(nowp[i][j]==7)noeff[i]++;
			ifp[i][j]=1;
		}	
	}
	for(int i=1;i<=m;i++)
		pdaw[i]=read();
}

inline void findjow(int x)
{
	if(passio[x]==1)
	{
		for(int i=2;i<=n;i++)
			if(lif[i])
			if(jum[i]==3||jum[i]==4)
			{
				jow[x]=i;
				return;
			}
	}
	if(passio[x]==2)
	{
		LNT
			if(lif[i])
			if(jum[i]==3)
			{
				jow[x]=i;
				return;
			}
	}
	if(passio[x]==3)
	{
		LNT
			if(lif[i])
			if(jum[i]==2)
			{
				jow[x]=i;
				return;
			}
	}
	jow[x]=0;return;
}

inline void findjump(int x,int y)
{
	if(x!=1)
	{
		if(jum[y]!=3)
			jum[x]=3;
		else
		{
			if(jum[x]==4)
			{
				jum[x]=2;
				findjow(1);
			}jum[x]=2;
		}
	}
}

inline void getp(int x)
{
	nowpdaw=min(m,nowpdaw+1);
	nowp[x][++tail[x]]=pdaw[nowpdaw];
	if(nowp[x][tail[x]]==1)
		attac[x]++,what[x][tail[x]]=1;
	if(nowp[x][tail[x]]==2)
		elude[x]++,whel[x][tail[x]]=1;
	if(nowp[x][tail[x]]==3)
		rescu[x]++,whre[x][tail[x]]=1;
	if(nowp[x][tail[x]]==7)
		noeff[x]++,whno[x][tail[x]]=1;
	ifp[x][tail[x]]=1;
}

inline void loseblood(int from,int x)
{
	blood[x]--;
	if(blood[x]==0)
	{
		if(rescu[x]==0)
		{
			lif[x]=0;if(x==1){whilend=1;return;}
			findjow(from);
//award or disagree!!!
			int mark=0;
			for(int i=1;i<=n;i++)
				if(lif[i]==1&&passio[i]==3)mark=1;
			if(mark==0){whilend=1;return;}
			if(passio[x]==3){getp(from);getp(from);getp(from);}
			if(passio[x]==2&&from==1)head[1]=tail[1]+1,zhuge[1]=0,attac[1]=0,elude[1]=0,rescu[1]=0;
		}
		else
		{
			rescu[x]--;
			for(int i=head[x];i<=tail[x];i++)
			{
				if(whre[x][i]==1)
				{
					whre[x][i]=0;
					blood[x]=1;
					return;
				}
			}
		}
	}
}

inline void attack(int x,int y,int kind)
{
	if(kind==1)
	{
		if(jum[x]==0)findjump(x,y);
		if(elude[y]>0)
		{
			elude[y]--;
			for(int i=head[y];i<=tail[y];i++)
			{
				if(whel[y][i]==1)
				{
					whel[y][i]=0;
					break;
				}
			}
		}
		else  loseblood(x,y);
	}
	if(kind==4)
	{
		ifhavef=0;
		if(jum[x]==0)findjump(x,y);
		LNT
		{
			if(noeff[i]>0)
			{
				if(jum[y]==2||y==1)
				{
					if(passio[i]==2||i==1)
					{
						if(i!=1)jum[i]=2;
						ifhavef=1;
						attack(i,2,7);
					}
				}
				if(jum[y]==3)
				{
					if(passio[i]==3)
					{
						jum[i]=3;
						ifhavef=1;
						attack(i,3,7);
					}
				}
			}
		}
		if(ifhavef==1)return;
		if(x==1&&passio[y]==2)  {loseblood(x,y);return;}
		else
		{
			int i=0;
			while(1)
			{
				i++;
				if(i%2==1)
				{
					if(attac[y]>0)
					{
					attac[y]--;
					for(int i=head[y];i<=tail[y];i++)
					{
						if(what[y][i]==1)
						{
							what[y][i]=0;
							break;
						}
					}
					}
					else  {loseblood(x,y);return;}
				}
				if(i%2==0)
				{
					if(attac[x]>0)
					{
					attac[x]--;
					for(int i=head[x];i<=tail[x];i++)
					{
						if(what[x][i]==1)
						{
							what[x][i]=0;
							break;
						}
					}
					}
					else  {loseblood(y,x);return;}
				}
			}
		}
	}
	if(kind==5)
	{
		LNT
		{
			if(x==i)continue;
			ifhavef=0;
			ENT
			{
				if(noeff[j]>0)
				{
					if(jum[i]==2||i==1)
					{
						if(passio[j]==2||j==1)
						{
							if(j!=1)jum[j]=2;
							ifhavef=1;
							attack(j,2,7);
						}
					}
					if(jum[i]==3)
					{
						if(passio[j]==3)
						{
							jum[j]=3;
							ifhavef=1;
							attack(j,3,7);
						}
					}
				}
			}
			if(ifhavef)continue;
			else
			{
				if(attac[y]>0)
				{
					attac[y]--;
					for(int i=head[y];i<=tail[y];i++)
					{
						if(what[y][i]==1)
						{
							what[y][i]=0;
							break;
						}
					}
				}
				else  
				{
					if(i==1&&jum[x]==0)jum[x]=4;
					loseblood(x,i);
				}	
			}
		}
	}
	if(kind==6)
	{
		LNT
		{
			if(x==i)continue;
			ifhavef=0;
			ENT
			{
				if(noeff[j]>0)
				{
					if(jum[i]==2||i==1)
					{
						if(passio[j]==2||j==1)
						{
							if(j!=1)jum[j]=2;
							ifhavef=1;
							attack(j,2,7);
						}
					}
					if(jum[i]==3)
					{
						if(passio[j]==3)
						{
							jum[j]=3;
							ifhavef=1;
							attack(j,3,7);
						}
					}
				}
			}
			if(ifhavef)continue;
			else
			{
				if(elude[y]>0)
				{
					elude[y]--;
					for(int i=head[y];i<=tail[y];i++)
					{
						if(whel[y][i]==1)
						{
							whel[y][i]=0;
							break;
						}
					}
				}
				else  
				{
					if(i==1&&jum[x]==0)jum[x]=4;
					loseblood(x,i);
				}	
			}
		}
	}
	if(kind==7)
	{
		LNT
		{
			if(noeff[i]>0)
			{
				if(jum[x]==2||x==1)
				{
					if(passio[i]==3)
					{
						jum[i]=3;
						ifhavef=(ifhavef+1)%2;
						noeff[i]--;
						for(int j=head[i];j<=tail[i];i++)
						{
							if(whno[i][j]==1)
							{
								whno[i][j]=0;
								break;
							}
						}
						attack(i,3,7);
					}
				}
				if(jum[x]==3)
				{
					if(passio[i]==2||i==1)
					{
						if(i!=1)jum[i]=2;
						ifhavef=(ifhavef+1)%2;
						noeff[i]--;
						for(int j=head[i];j<=tail[i];i++)
						{
							if(whno[i][j]==1)
							{
								whno[i][j]=0;
								break;
							}
						}
						attack(i,2,7);
					}
				}
			}
		}
	}
}

inline int dis(int x,int y)
{
	int ans=0;
	for(int i=x;i!=y;i=max(1,(i+1)%(n+1)))
		if(lif[i])ans++;
	return ans;
}

inline void outn(int x)
{
	bool sha=0;
	getp(x);getp(x);findjow(x);
	for(int i=head[x];i<=tail[x]&&head[x]<=tail[x];i++)
	{
		if(whilend==1)return;
		bool ifpai=0;
		if(ifp[x][i]==1)
		{
		if(nowp[x][i]==1&&sha==0)
		{
			if(jow[x]!=0)
			{if(dis(x,jow[x])<=1)
				attack(x,jow[x],1);
				ifp[x][i]=0;
				if(!zhuge[x])sha=1;
				ifpai=1;	
			}
			else if(passio[x]==3&&dis(x,1)<=1)
			{
				attack(x,1,1);
				ifp[x][i]=0;
				if(!zhuge[x])sha=1;
				ifpai=1;	
			}
		}
		if(nowp[x][i]==3&&blood[x]<4)
		{
			blood[x]++;
			ifp[x][i]=0;
			ifpai=1;
		}
		if((nowp[x][i]==4&&jow[x]!=0)||nowp[x][i]==5||nowp[x][i]==6)
		{
			if(nowp[x][i]==4)
			{
				if(passio[x]==3)
				{
					attack(x,1,nowp[x][i]);
				ifp[x][i]=0;
				ifpai=1;
				}
				else if(jow[x]!=0)
				{
					attack(x,jow[x],nowp[x][i]);
				ifp[x][i]=0;
				ifpai=1;
				}
			}
			else
			{
				attack(x,jow[x],nowp[x][i]);
				ifp[x][i]=0;
				ifpai=1;	
			}
		}
		if(nowp[x][i]==8)
		{
			zhuge[x]=1;sha=0;i=head[x];ifp[x][i]=0;
			ifpai=1;
		}	
	//	cout<<nowp[x][i]<<" ";
		}
		if(i==head[x]&&ifpai==1)head[x]++;
	}
//	cout<<endl;
}

void solve()
{
	int nowx=1;
	while(!whilend)
	{
		if(lif[nowx])
			outn(nowx);
		nowx=max(1,(nowx+1)%(n+1));
		if(nowx==3)
			nowx=3;
	}	
}

void print()
{
	if(lif[1])cout<<"MP"<<endl;else cout<<"FP"<<endl;
	for(int i=1;i<=n;i++)
	{
		if(lif[i])
		{
			for(int j=head[i];j<=tail[i];j++)
			{
				if(ifp[i][j])
				{
					if(nowp[i][j]==1)cout<<"K";
					if(nowp[i][j]==2)cout<<"D";
					if(nowp[i][j]==3)cout<<"P";
					if(nowp[i][j]==4)cout<<"F";
					if(nowp[i][j]==5)cout<<"N";
					if(nowp[i][j]==6)cout<<"W";
					if(nowp[i][j]==7)cout<<"J";
					if(nowp[i][j]==8)cout<<"Z";
					cout<<" ";
				}
			}
		}
		else cout<<"DEAD";
		cout<<endl;
	}
}

int main()
{
	init();
//	for(int i=1;i<=n;i++)
//	for(int j=1;j<=4;j++)cout<<ifp[i][j]<<" ";
	solve();
	print();
	return 0;
}

真的有人会帮忙吗...

2024/11/8 16:45
加载中...