新手求调,23个点21个TLE2个WA
查看原帖
新手求调,23个点21个TLE2个WA
1300710
yuxusheng楼主2024/5/9 09:18
#include <bits/stdc++.h>
using namespace std;	
struct player
{
	string actor;//身份 
	char armor;
	int hp, sha, shan, tao, nanman, wanjian, zhuge, wuxie, juedou;
	string known[1005];
	bool alive;
}p[1005];
int n, card, fnum, now, cnow = 1;
char a[1005];
void solve(char c, int i)
{
	if(c == 'K')p[i].sha++;
	else if(c == 'D')p[i].shan++;
	else if(c == 'P')p[i].tao++;
	else if(c == 'N')p[i].nanman++;
	else if(c == 'W')p[i].wanjian++;
	else if(c == 'J')p[i].wuxie++;
	else if(c == 'Z')p[i].zhuge++;
	else if(c == 'F')p[i].juedou++;
}
void zero(int i)
{
	p[i].armor = '#';
	p[i].sha = 0;
	p[i].shan = 0;
	p[i].tao = 0;
	p[i].nanman = 0;
	p[i].wanjian = 0;
	p[i].zhuge = 0;
	p[i].wuxie = 0;
	p[i].juedou = 0;
}/*
void showcard(int i)
{
	cout << i << "号的牌:";
	for(int j = 1; j <= p[i].sha; j++)cout << 'K';
	for(int j = 1; j <= p[i].shan; j++)cout << 'D';
	for(int j = 1; j <= p[i].tao; j++)cout << 'T';
	for(int j = 1; j <= p[i].nanman; j++)cout << 'N';
	for(int j = 1; j <= p[i].wanjian; j++)cout << 'W';
	for(int j = 1; j <= p[i].wuxie; j++)cout << 'J';
	for(int j = 1; j <= p[i].zhuge; j++)cout << 'Z';
	for(int j = 1; j <= p[i].juedou; j++)cout << 'F';
	cout << endl;	
}*/

void willdie(int i)
{
	for(int j = 1; j <= n; j++)
	{
		if(i == j && p[i].tao != 0)
		{
			//cout << j << "用桃救了" << i << endl;//测试 
			p[i].tao--;
			p[i].hp++;
			//showcard(j);
		}
		else if(p[i].actor == "MP" && p[j].actor == "ZP")
		{
			//cout << j << "用桃救了" << i << endl;//测试 
			p[j].tao--;
			p[i].hp++;
			//showcard(j);
			for(int k = 1; k <= n; k++)
			{
				p[k].known[now] = "ZP";
			}
		}
		else if(p[j].known[i] == "FP" && p[j].actor == "FP")
		{
			//cout << j << "用桃救了" << i << endl;//测试 
			p[j].tao--;
			p[i].hp++;
			//showcard(j);
			for(int k = 1; k <= n; k++)
			{
				p[k].known[j] = "FP";
			}
		}
	}
	if(p[i].hp == 0)
	{
		//cout << i << "被" << now << "杀了\n";//测试 
		p[i].alive = 0;
		if(p[1].alive == 0)
		{
			cout << "FP\n";
			for(int x = 1; x <= n; x++)
			{
				if(p[x].alive == 1)
				{
					for(int y = 1; y <= p[x].sha; y++)cout << 'K' << " ";
					for(int y = 1; y <= p[x].shan; y++)cout << 'D' << " ";
					for(int y = 1; y <= p[x].tao; y++)cout << 'T' << " ";
					for(int y = 1; y <= p[x].nanman; y++)cout << 'N' << " ";
					for(int y = 1; y <= p[x].wanjian; y++)cout << 'W' << " ";
					for(int y = 1; y <= p[x].wuxie; y++)cout << 'J' << " ";
					for(int y = 1; y <= p[x].zhuge; y++)cout << 'Z' << " ";
					for(int y = 1; y <= p[x].juedou; y++)cout << 'F' << " ";
				}
				else cout << "DEAD";
				cout << endl;	
			}
			exit(0);
		}
		if(p[i].actor == "ZP" && p[now].actor == "MP")
		{
			//cout << i << "被主公杀掉,清空主公牌\n";
			zero(now);
		}
		else if(p[i].actor == "FP")
		{
			//cout << i << "是反贼," << now << "摸三张牌\n";
			fnum--;
			if(fnum == 0)
			{
				cout << "MP\n";
				for(int x = 1; x <= n; x++)
				{
					if(p[x].alive == 1)
					{
						for(int y = 1; y <= p[x].sha; y++)cout << 'K' << " ";
						for(int y = 1; y <= p[x].shan; y++)cout << 'D' << " ";
						for(int y = 1; y <= p[x].tao; y++)cout << 'T' << " ";
						for(int y = 1; y <= p[x].nanman; y++)cout << 'N' << " ";
						for(int y = 1; y <= p[x].wanjian; y++)cout << 'W' << " ";
						for(int y = 1; y <= p[x].wuxie; y++)cout << 'J' << " ";
						for(int y = 1; y <= p[x].zhuge; y++)cout << 'Z' << " ";
						for(int y = 1; y <= p[x].juedou; y++)cout << 'F' << " ";
					}
					else cout << "DEAD";
					cout << endl;	
				}
				exit(0);
			}
			solve(a[cnow], now);
			if(cnow != n)cnow++;
			solve(a[cnow], now);
			if(cnow != n)cnow++;
			solve(a[cnow], now);
			if(cnow != n)cnow++;
		}
	}
}

void nanman(int now)
{
	if(p[now].nanman != 0)//使用南蛮 
	{
		//cout << now << "号使用了南蛮入侵\n";
		//showcard(now);
		p[now].nanman--;
		while(p[now].nanman != 0)
		{
			for(int i = 1; i < now; i++)
			{
				if(p[i].alive == 0)continue;
				bool need = 1;
				for(int j = 1; j <= n; j++)
				{
					if(p[j].alive == 1)
					{
						if(p[j].known[i] == "FP" && p[j].actor == "FP")
						{
							//cout << j << "使用了无懈可击,抵挡了" << i << "的被攻击\n";
							//showcard(j);
							p[j].wuxie--;
							need = 0;
							for(int k = 1; k <= n; i++)p[k].known[j] == "FP";
						}
					}
				}
				if(need)
				{
					if(p[i].sha != 0)p[i].sha--;
					else p[i].hp--;
					//showcard(i);
					//cout << i << "号血量:" << p[i].hp << endl;
					if(p[i].hp == 0)
					{
						//cout << i << "濒死了\n";
						willdie(i);
					}
				}
			}
			for(int i = now + 1; i <= n; i++)
			{
				if(p[i].alive == 0)continue;
				bool need = 1;
				for(int j = 1; j <= n; j++)
				{
					if(p[j].alive == 1)
					{
						if(p[j].known[i] == "FP" && p[j].actor == "FP")
						{
							//cout << j << "使用了无懈可击,抵挡了" << i << "的被攻击\n";
							//showcard(j);
							p[j].wuxie--;
							need = 0;
							for(int k = 1; k <= n; i++)p[k].known[j] == "FP";
						}
					}
				}
				if(need)
				{
					if(p[i].sha != 0)p[i].sha--;
					else p[i].hp--;
					//showcard(i);
					//cout << i << "号血量:" << p[i].hp << endl;
					if(p[i].hp == 0)
					{
						//cout << i << "濒死了\n";
						willdie(i);
					}
				}
			}
		}
		while(p[now].wanjian != 0)
		{
			p[now].wanjian--;
			for(int i = 1; i < now; i++)
			{
				if(p[i].alive == 0)continue;
				bool need = 1;
				for(int j = 1; j <= n; j++)
				{
					if(p[j].alive == 1)
					{
						if(p[j].known[i] == "FP" && p[j].actor == "FP")
						{
							p[j].wuxie--;
							//cout << j << "使用了无懈可击,抵挡了" << i << "的被攻击\n";
							//showcard(j);
							need = 0;
							for(int k = 1; k <= n; i++)p[k].known[j] == "FP";
						}
					}
				}
				if(need)
				{
					if(p[i].shan != 0)p[i].shan--;
					else p[i].hp--;
					//showcard(i);
					//cout << i << "号血量:" << p[i].hp << endl;
					if(p[i].hp == 0)
					{
						//cout << i << "濒死了\n";
						willdie(i);
					}
				}
			}
			for(int i = now + 1; i <= n; i++)
			{
				if(p[i].alive == 0)continue;
				bool need = 1;
				for(int j = 1; j <= n; j++)
				{
					if(p[j].alive == 1)
					{
						if(p[j].known[i] == "FP" && p[j].actor == "FP")
						{
							p[j].wuxie--;
							//cout << j << "使用了无懈可击,抵挡了" << i << "的被攻击\n";
							//showcard(j);
							need = 0;
							for(int k = 1; k <= n; i++)p[k].known[j] == "FP";
						}
					}
				}
				if(need)
				{
					if(p[i].shan != 0)p[i].shan--;
					else p[i].hp--;
					//showcard(i);
					//cout << i << "号血量:" << p[i].hp << endl;
					if(p[i].hp == 0)
					{
						//cout << i << "濒死了\n";
						willdie(i);
					}
				}
			}
		}
	}	
}
int main()
{
	cin >> n >> card;
	now = 0;
	for(int i = 1; i <= n; i++) 
	{
		cin >> p[i].actor;
		if(p[i].actor == "FP")fnum++;
		for(int j = 1; j <= 4; j++)
		{
			char c;
			cin >> c;
			solve(c, i);
		}
		p[i].alive = 1;
		p[i].hp = 4;
		p[i].armor = '#';
		//showcard(i);
	}
	for(int i = 1; i <= card; i++)
	{
		cin >> a[i];
	}
	for(int i = 1; i <= n; i++)p[i].known[1] = "MP";
	
	while(1)
	{
		if(now == n)now = 1;
		else now++;

		if(p[now].alive == 0)
		{
			continue;
		}
		solve(a[cnow], now);//摸牌 
		if(cnow != n)cnow++;
		solve(a[cnow], now);
		if(cnow != n)cnow++;
		//cout << "现在坐标:" << now << endl;
		
		int prev, next;//设置前一人和后一人 
		if(now == 1)prev = n;
		else prev = now - 1;
		while(p[prev].alive == 0)
		{
			if(now == 1)prev = n;
			else prev = now - 1;
		}
		if(now == n)next = 1;
		else next = now + 1;
		while(p[next].alive == 0)
		{
			if(now == n)next = 1;
			else next = now + 1;			
		}
		
		//cout << "前一人:" << prev << endl;
		//cout << "后一人:" << next << endl;
		if(p[now].zhuge != 0)//装装备 吃桃 
		{
			while(p[now].zhuge != 0)
			{
				p[now].armor = 'Z';
				p[now].zhuge--;
			}
		}
		//showcard(now);
		while(p[now].hp < 4 && p[now].tao != 0)
		{
			p[now].hp++;
			p[now].tao--;
		}
		//showcard(now);
		//cout << now << "号血量:" << p[now].hp << endl;
		nanman(now);
		if(p[now].actor == "MP")//主公 
		{
			int limit = 1;
			if(p[now].armor == 'Z')limit = 999999;
			if(p[now].known[next] == "FP")
			{
				while(limit && p[now].sha)
				{
					p[now].sha--;
					limit--;
					if(p[next].shan != 0)p[next].shan--;
					else p[next].hp--;
					if(p[next].hp == 0)willdie(next);
				}
			}
			if(p[now].known[prev] == "FP")
			{
				while(limit && p[now].sha)
				{
					p[now].sha--;
					limit--;
					if(p[prev].shan != 0)p[prev].shan--;
					else p[prev].hp--;
					if(p[prev].hp == 0)willdie(prev);
				}
			}
		}
		
		if(p[now].actor == "ZP")//忠臣
		{
			int limit = 1;
			if(p[now].armor == 'Z')limit = 999999;
			if(p[now].known[next] == "FP")
			{
				while(limit && p[now].sha)
				{
					p[now].sha--;
					limit--;
					if(p[next].shan != 0)p[next].shan--;
					else p[next].hp--;
					if(p[next].hp == 0)willdie(next);
				}
			}
			if(p[now].known[prev] == "FP")
			{
				while(limit && p[now].sha)
				{
					p[now].sha--;
					limit--;
					if(p[prev].shan != 0)p[prev].shan--;
					else p[prev].hp--;
					if(p[prev].hp == 0)willdie(prev);
				}
			}
		}
		if(p[now].actor == "FP")//反贼
		{
			int limit = 1, hurt = 0;
			if(p[now].armor == 'Z')limit = 999999;
			if(p[prev].actor == "MP")hurt = prev;
			else if(p[next].actor == "MP")hurt = next;
			else if(p[next].actor == "ZP")hurt = next;
			else if(p[prev].actor == "ZP")hurt = prev;
			
			if(hurt)
			{
				while(limit && p[now].sha)
				{
					p[now].sha--;
					limit--;
					if(p[hurt].shan != 0)p[hurt].shan--;
					else p[hurt].hp--;
					if(p[hurt].hp == 0)willdie(hurt);
				}
			}
		}
	}
	return 0;
}
2024/5/9 09:18
加载中...