猪国杀 5pts MLE求助大佬!!
  • 板块学术版
  • 楼主2021lzy
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/24 09:45
  • 上次更新2023/10/27 13:55:33
查看原帖
猪国杀 5pts MLE求助大佬!!
559790
2021lzy楼主2022/8/24 09:45

猪国杀5pts!!!

MLE+WA+TLE QWQ

下载的数据都太大了看不下去

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int playing;      //正在执行回合的人
string paidui;    //牌堆
int n,m;          //玩家数和牌堆中牌的数量
int paiduishu;    //牌堆中牌的数量
int top=-1;          //牌堆顶指针
int fanshu;       //反猪数量
struct Pig{
	string cards; //手牌
	int role;     //身份:1.主猪;2.忠猪;3.反猪
	int seem;     //跳的身份:0:没跳; 1:类反; 2:忠; 3:反;
	int hp;	      //剩余体力
	bool dead;	  //是否死亡
	bool wuqi;	  //是否装了连弩
	bool sha;     //是否使用过杀
	bool pai;     //是否使用过牌
	void mopai()  //摸牌函数
	{
		for(int i=1;i<=2;i++)
		{
			if(top<m) top++;
			cards.push_back(paidui[top]);
		}
	}
}pig[11];
void gameover()
{
	if(pig[1].dead)
	{
		printf("FP\n");
		for(int i=1;i<=n;i++)
		{
			if(pig[i].dead)
			{
				if(i==n) printf("DEAD");
				else printf("DEAD\n");
				continue;
			}
			for(int j=0;j<pig[i].cards.size();j++)
				printf("%c ",pig[i].cards[j]);
			if(i==n) break;
			printf("\n");
		}
		exit(0);
	}
	if(fanshu==0)
	{
		printf("MP\n");
		for(int i=1;i<=n;i++)
		{
			if(pig[i].dead)
			{
				if(i==n) printf("DEAD");
				else printf("DEAD\n");
				continue;
			}
			cout<<pig[i].cards[0];
			for(int j=1;j<pig[i].cards.size();j++)
				printf(" %c",pig[i].cards[j]);
			if(i==n) break;
			printf("\n");
		}
		exit(0);
	}
}
void readd()
{
	paiduishu=m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		pig[i].hp=4;
		string x;
		cin>>x;
		if(x=="MP") {pig[i].role=1;pig[i].seem=2;}
		else if(x=="ZP") pig[i].role=2;
		else if(x=="FP")
		{
			pig[i].role=3;
			fanshu++;
		}
//		else printf("身份错误!!");
		string xx;
		for(int j=1;j<=4;j++)
		{
			
   			cin>>xx;
			pig[i].cards.push_back(xx[0]);
		}
	}
	string xx;
	for(int i=1;i<=m;i++)
	{
		
  		cin>>xx;
		paidui.push_back(xx[0]);
	}
	if(fanshu==0)
	{
		gameover();
	}
}
bool shiyong(int shi,char yongpai)
{
	int paizhizhen=-1;
//	printf("正在使用%c\n",yongpai);
	paizhizhen=pig[shi].cards.find(yongpai);
	if(paizhizhen==-1)
	{
//		printf("没有使用\n");
		return 0;
	}
	pig[shi].cards.erase(paizhizhen,1);
//	printf("使用\n");
	return 1;
}
void binsi(int shi,int bei)
{
	if(pig[bei].hp<1)
		if(shiyong(bei,'P'))
			pig[bei].hp++;
	if(pig[bei].hp<1)
	{
		if(pig[bei].role==3)
		{
			pig[bei].cards="";
			pig[bei].wuqi=0;
			fanshu--;
			pig[bei].dead=true;
			gameover();
			pig[shi].mopai();
			pig[shi].mopai();
			pig[shi].mopai();
		}
		if(pig[bei].role==2 && pig[shi].role==1)
		{
			pig[shi].cards="";
			pig[shi].wuqi=0;
			pig[bei].cards="";
			pig[bei].wuqi=0;
			pig[bei].dead=true;
		}
		if(pig[bei].role==1)
		{
			pig[bei].cards="";
			pig[bei].wuqi=0;
			pig[bei].dead=true;
			gameover();
		}
	}
}
void juedou(int shi,int bei)
{
//	printf("pig[%d]与pig[%d]决斗\n",shi,bei);
	if(pig[bei].role==2 && pig[shi].role==1)
	{
		pig[bei].hp--;
//		printf("忠臣pig[%d]没有响应决斗,当前血量为%d\n",bei,pig[bei].hp);
		if(pig[bei].hp<1) binsi(shi,bei);
		return;
	}
	if(shiyong(bei,'K')) juedou(bei,shi);
	else
	{
		pig[bei].hp--;
		if(pig[bei].hp<1) binsi(shi,bei);
		return;
	}
}
bool wuxie(int shi)
{
	bool di_or_not;
	bool flag;
	for(int i=shi+1;;i++)
	{
		if(i>n)
		{
			i=1;
			flag=true;
		}
		if(flag && i==shi) break;
		if(pig[i].dead) continue;
		if(pig[shi].role!=pig[i].role)
		{
			if(shiyong(i,'J'));
			if(wuxie(i))
			{
				di_or_not=true;
				break;
			}
		}
	}
	if(di_or_not) return 0;
	return 1;
}
void nan(int shi)
{
	for(int i=1;i<=n;i++)
	{
		if(i==shi) continue;
		bool wuxie_or_not;
		if(!pig[i].dead && i!=shi)
			if(pig[i].seem!=0)
			{
				bool flag=false;
				for(int j=shi;;j++)
				{
					if(j>n)
					{
						j=1;
						flag=true;
					}
					if(flag && j==shi) break;
					if(pig[j].dead) continue;
					if((pig[j].role==pig[i].seem && pig[i].seem!=1) || (pig[j].role==1 && pig[i].seem==2))
						if(shiyong(j,'J'))
						{
							pig[j].seem=pig[i].seem;
							if(wuxie(j))
							{
								wuxie_or_not=true;
								break;
							}
						}
				}
			}
		if(wuxie_or_not) continue;
		if(!shiyong(i,'K'))
		{
			pig[i].hp--;
//			printf("pig[%d]没有响应南蛮入侵\n当前血量为:%d\n",i,pig[i].hp);
			if(pig[i].role==1 && pig[shi].seem==0)
				pig[shi].seem=1;
		}
		if(pig[i].hp<1) binsi(shi,i);
	}
}
void wan(int shi)
{
	for(int i=1;i<=n;i++)
	{
		if(i==shi) continue;
		bool wuxie_or_not;
		if(!pig[i].dead)
			if(pig[i].seem!=0)
			{
				bool flag=false;
				for(int j=shi;;j++)
				{
					if(j>n)
					{
						j=1;
						flag=true;
					}
					if(flag && j==shi) break;
					if(pig[j].dead) continue;
					if((pig[j].role==pig[i].seem && pig[i].seem!=1) || (pig[j].role==1 && pig[i].seem==2))
						if(shiyong(j,'J'))
						{
							pig[j].seem=pig[i].seem;
							if(wuxie(j))
							{
								wuxie_or_not=true;
								break;
							}
						}
				}
			}
				
		if(wuxie_or_not) continue;
		if(!shiyong(i,'D'))
		{
			pig[i].hp--;
//			printf("pig[%d]没有响应万箭齐发\n当前血量为:%d\n",i,pig[i].hp);
			if(pig[i].role==1 && pig[shi].seem==0)
				pig[shi].seem=1;
		}
		if(pig[i].hp<1) binsi(shi,i);
	}
}
int findjue(int shi)
{
	int ans=-1;
	if(pig[shi].role==3)
	{
		ans=1;
		pig[shi].seem=3;
	}
	if(pig[shi].role==1)
	{
		bool flag;
		for(int i=shi;;i++)
		{
			if(i>n)
			{
				i=1;
				flag=true;
			}
			if(i==shi && flag) break;
			if(pig[i].dead) continue;
			if(pig[i].seem==1 || pig[i].seem==3)
			{
				ans=i;
//				printf("ans=%d\n",ans);
				return ans;
			}
		}
	}
	if(pig[shi].role==2)
	{
		bool flag;
		for(int i=shi;;i++)
		{
			if(i>n)
			{
				i=1;
				flag=true;
			}
			if(i==shi && flag) break;
			if(pig[i].dead) continue;
			if(pig[i].seem==3)
			{
				ans=i;
				pig[shi].seem=2;
				break;
			}
		}
	}
	return ans;
}
bool juexiao(int shi,int bei)
{
	bool wuxie_or_not;
	if(pig[bei].seem!=0)
	{
		bool flag;
		for(int j=shi+1;;j++)
		{
			if(j>n)
			{
				flag=true;
				j=1;
			}
			if(j==shi && flag) break;
			if(pig[j].dead) continue;
			if(pig[j].role==pig[bei].role)
				if(shiyong(j,'J'))
				{
					pig[j].seem=pig[bei].seem;
					if(wuxie(j))
					{
						wuxie_or_not=true;
						break;
					}
				}
		}
	}
//	cout<<wuxie_or_not<<endl;
	if(wuxie_or_not) return 0;
	return 1;
}
int shaxiao(int shi)
{
	bool flag;
	int ans=shi+1;
	for(int i=shi+1;;i++)
	{
		if(i>n)
		{
			i=1;
			flag=true;
		}
		if(i==shi) break;
		if(!pig[i].dead)
		{
			ans=i;
			break;
		}
	}
	if(pig[shi].role==1 && pig[ans].seem!=pig[shi].seem) return 1;
	if(pig[shi].role==2 && pig[ans].seem==3) return 1;
	if(pig[shi].role==3 && pig[ans].seem!=pig[shi].seem) return 1;
	return -1;
}
void sha(int shi,int bei)
{
	if(pig[bei].seem==3) pig[shi].seem=2;
	if(pig[bei].seem==2) pig[shi].seem=3;
	if(!shiyong(bei,'D')) pig[bei].hp--;
	if(pig[bei].hp<1) binsi(shi,bei);
}
int main()
{
	readd();
	while(1)
	{
		playing++;
		if(playing>n) playing=1;
		if(pig[playing].dead) continue;
		pig[playing].sha=false;
		pig[playing].mopai();
		while(1)
		{
			pig[playing].pai=false;
			for(int i=0;i<pig[playing].cards.size();i++)
			{
//				if(pig[playing].cards[i]=='D') continue;
				if(pig[playing].cards[i]=='P' && pig[playing].hp<4)
				{
					pig[playing].cards.erase(i,1);
					pig[playing].pai=true;
					pig[playing].hp++;
//					printf("pig[%d]使用了一个桃\n当前血量为:%d",playing,pig[playing].hp);
				}
				if(pig[playing].cards[i]=='Z')
				{
					pig[playing].cards.erase(i,1);
					pig[playing].wuqi=true;
					pig[playing].pai=true;
//					printf("pig[%d]装上了诸葛连弩\n",playing);
				}
				if(pig[playing].cards[i]=='N')
				{
					pig[playing].cards.erase(i,1);
//					printf("pig[%d]打出了一张南蛮入侵\n",playing);
					nan(playing);
					pig[playing].pai=true;
				}
				if(pig[playing].cards[i]=='W')
				{
					pig[playing].cards.erase(i,1);
//					printf("pig[%d]打出了一张万箭齐发\n",playing);
					wan(playing);
					pig[playing].pai=true;
				}
				if(pig[playing].cards[i]=='F')
				{
					int beijue=findjue(playing);
					if(beijue==-1) continue;
					pig[playing].cards.erase(i,1);
					pig[playing].pai=true;
					if(juexiao(playing,beijue))
						juedou(playing,beijue);
				}
				if(pig[playing].cards[i]=='K' && shaxiao(playing)!=-1)
				{
					if(!pig[playing].sha || pig[playing].wuqi)
					{
						pig[playing].cards.erase(i,1);
						pig[playing].pai=true;
						sha(playing,shaxiao(playing));
						pig[playing].sha=true;
					}
				}
//				cout<<pig[playing].cards<<endl;
				if(pig[playing].pai) break;
			}
			if(!pig[playing].pai) break;
			if(pig[playing].hp<1) break;
		}
	}
}
2022/8/24 09:45
加载中...