RE 求调
查看原帖
RE 求调
998662
xk2013楼主2024/5/3 11:07

全 RE。

#include <cstdio>
#include <cstring>

int n, m, alive_fp, curc, res = -1;
char queue[2000];
bool clear_mark;

struct Pig
{
	int front;
	int next;
	int id;
	int hp;
	int used_card;
	int global_id;
	
	bool zb;
	bool alive;
	char cards[2000];
	bool is_used[2000];
};

Pig pigs[10];

void get_initial_info(int cur);
void judge_identity(int cur);
void get_initial_card(int cur);
void get_card_queue(void);
void get_card(int cur);
void use_shan(int cur);
void die(int cur, int killer);
void battle(int attacker, int defender);
bool use_peach(int cur);
bool use_kill(int cur);
bool use_fight(int cur);
bool use_wxkj(int cur, int sit);
bool use_zgln(int cur);
bool use_nmrq(int cur);
bool use_wjqf(int cur);

int main(void)
{
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; i++)
	{
		get_initial_info(i);
	}
	
	get_card_queue();
	
	while (res == -1)
	{
		for (int i = 1; i <= n; i = pigs[i].next)
		{
			get_card(i);
			get_card(i);
			
			int used_kill = 0;
			
			for (int j = 1; j <= pigs[i].used_card; j++)
			{
				bool is_used = false;
				
				if (!pigs[i].is_used[j])
				{
					switch (pigs[i].cards[j])
					{
					case 'P':
						is_used = use_peach(i);
						break;
						
					case 'K':
						if (used_kill == 0 || pigs[i].zb)
						{
							is_used = use_kill(i);
						}
						
						if (is_used)
						{
							used_kill++;
						}
						break;
						
					case 'F':
						is_used = use_fight(i);
						break;
						
					case 'Z':
						is_used = use_zgln(i);
						break;
						
					case 'N':
						is_used = use_nmrq(i);
						break;
						
					case 'W':
						is_used = use_wjqf(i);
						break;
					}
				}
				
				if (is_used)
				{
					if (i == 1 && clear_mark)
					{
						clear_mark = false;
					}
					else
					{
						pigs[i].is_used[j] = true;
					}
					
					j = 1;
				}
				
				if (!pigs[i].alive)
				{
					break;
				}
				
				if (res != -1)
				{
					break;
				}
			}
			
			if (res != -1)
			{
				break;
			}
		}
	}
	
	if (res == 0)
	{
		printf("MP\n");
	}
	else
	{
		printf("FP\n");
	}
	
	for (int i = 1; i <= n; i++)
	{
		if (pigs[i].alive)
		{
			for (int j = 1; j <= pigs[i].used_card; j++)
			{
				if (!pigs[i].is_used[j])
				{
					printf("%c ", pigs[i].cards[j]);
				}
			}
			
			putchar('\n');
		}
		else
		{
			printf("DEAD\n");
		}
	}
	
	return 0;
}

void get_initial_info(int cur)
{
	judge_identity(cur);
	get_initial_card(cur);
	
	if (cur == 1)
	{
		pigs[cur].front = n - 1;
	}
	else
	{
		pigs[cur].front = cur - 1;
	}
	
	if (cur == n - 1)
	{
		pigs[cur].next = 1;
	}
	else
	{
		pigs[cur].next = cur + 1;
	}
	
	pigs[cur].alive = true;
	pigs[cur].hp = 4;
}

void judge_identity(int cur)
{
	char s[2];
	scanf("%s", s);
	
	if (s[0] == 'M')
	{
		pigs[cur].id = 0;
		pigs[cur].global_id = 1;
	}
	else if (s[0] == 'Z')
	{
		pigs[cur].id = 1;
	}
	else
	{
		pigs[cur].id = 2;
		alive_fp++;
	}
}

void get_initial_card(int cur)
{
	char s[2];
	
	for (int i = 0; i < 4; i++)
	{
		scanf("%s", s);
		
		pigs[cur].used_card++;
		pigs[cur].cards[i] = s[0];
	}
}

void get_card_queue(void)
{
	for (int i = 0; i < m; i++)
	{
		char s[2];
		scanf("%s", s);
		queue[i] = s[0];
	}
}

void get_card(int cur)
{
	pigs[cur].cards[++pigs[cur].used_card] = queue[curc];
	
	if (curc != m)
	{
		curc++;
	}
}

void use_shan(int cur)
{
	for (int i = 0; i < pigs[cur].used_card; i++)
	{
		if (pigs[cur].cards[i] == 'D' && !pigs[cur].is_used[i])
		{
			pigs[cur].is_used[i] = true;
			return;
		}
	}
	
	pigs[cur].hp--;
}

void die(int cur, int killer)
{
	for (int i = 1; i <= pigs[cur].used_card; i++)
	{
		if (pigs[cur].cards[i] == 'P' && !pigs[cur].is_used[i])
		{
			pigs[cur].is_used[i] = true;
			pigs[cur].hp++;
			
			if (pigs[cur].hp > 0)
			{
				return;
			}
		}
	}
	
	pigs[cur].alive = false;
	pigs[pigs[cur].front].next = pigs[cur].next;
	pigs[pigs[cur].next].front = pigs[cur].front;
	
	if (pigs[cur].id == 1)
	{
		res = 1;
	}
	else if (pigs[cur].id == 2)
	{
		alive_fp--;
		
		if (alive_fp == 0)
		{
			res = 0;
			return;
		}
		
		get_card(killer);
		get_card(killer);
		get_card(killer);
	}
	else if (pigs[cur].id == 1 && killer == 1)
	{
		pigs[killer].used_card = 0;
		memset(pigs[killer].cards, 0, sizeof pigs[killer].cards);
		memset(pigs[killer].is_used, false, sizeof pigs[killer].is_used);
		pigs[killer].zb = false;
		clear_mark = true;
	}
}

void battle(int attacker, int defender)
{
	if (attacker == 1 && pigs[defender].id == 1)
	{
		pigs[defender].hp--;
		
		if (pigs[defender].hp <= 0)
		{
			die(defender, attacker);
		}
		
		return;
	}
	
	int curp = defender;
	
	while (true)
	{
		bool flag = false;
		
		for (int i = 1; i <= pigs[curp].used_card; i++)
		{
			if (pigs[curp].cards[i] == 'K' && !pigs[curp].is_used[i])
			{
				pigs[curp].is_used[i] = true;
				flag = true;
				break;
			}
		}
		
		if (flag)
		{
			curp = curp == defender ? defender : attacker;
		}
		else
		{
			pigs[curp].hp--;
			
			if (pigs[curp].hp <= 0)
			{
				die(curp, curp == attacker ? defender : attacker);
			}
			
			return;
		}
	}
}

bool use_peach(int cur)
{
	if (pigs[cur].hp < 4)
	{
		pigs[cur].hp++;
		return true;
	}
	
	return false;
}

bool use_kill(int cur)
{
	if (pigs[cur].id == 2)
	{
		if (pigs[pigs[cur].next].global_id == 1 && (pigs[pigs[cur].next].id == 1 || pigs[pigs[cur].next].id == 0))
		{
			pigs[cur].global_id = 1;
			use_shan(pigs[cur].next);
			
			if (pigs[pigs[cur].next].hp <= 0)
			{
				die(pigs[cur].next, cur);
			}
			
			return true;
		}
	}
	else if (pigs[cur].id == 2)
	{
		if (pigs[pigs[cur].next].global_id == 1 && (pigs[pigs[cur].next].id == 1 || pigs[pigs[cur].next].id == 0))
		{
			pigs[cur].global_id = 1;
			use_shan(pigs[cur].next);
			
			if (pigs[pigs[cur].next].hp <= 0)
			{
				die(pigs[cur].next, cur);
			}
			
			return true;
		}
	}
	else
	{
		if (pigs[pigs[cur].next].global_id == 2 || (pigs[pigs[cur].next].global_id == 1 && pigs[pigs[cur].next].id == 2))
		{
			pigs[cur].global_id = 1;
			use_shan(pigs[cur].next);
			
			if (pigs[pigs[cur].next].hp <= 0)
			{
				die(pigs[cur].next, cur);
			}
			
			return true;
		}
	}
	
	return false;
}

bool use_fight(int cur)
{
	if (pigs[cur].id == 2)
	{
		pigs[cur].global_id = 1;
		
		if (!use_wxkj(cur, 1))
		{
			battle(cur, 1);
		}
		
		return true;
	}
	else if (pigs[cur].id == 1)
	{
		for (int i = pigs[cur].next; i != cur; i = pigs[i].next)
		{
			if (pigs[i].global_id == 1 && pigs[i].id == 2)
			{
				pigs[cur].global_id = 1;
				
				if (!use_wxkj(cur, 2))
				{
					battle(cur, i);
				}
				
				return true;
			}
		}
	}
	else
	{
		for (int i = pigs[cur].next; i != cur; i = pigs[i].next)
		{
			if ((pigs[i].global_id == 1 && pigs[i].id == 2) || pigs[i].global_id == 2)
			{
				bool flag = false;
				
				if (pigs[i].global_id == 1)
				{
					flag = use_wxkj(cur, 2);
				}
				
				if (!flag)
				{
					battle(1, i);
				}
				
				return true;
			}
		}
	}
	
	return false;
}

bool use_wxkj(int cur, int sit)
{
	int curp = cur;
	
	do
	{
		if (pigs[curp].id != 2 && sit == 1)
		{
			for (int i = 1; i <= pigs[curp].used_card; i++)
			{
				if (pigs[curp].cards[i] == 'J' && !pigs[curp].is_used[i])
				{
					pigs[curp].is_used[i] = true;
					
					if (pigs[curp].global_id != 1)
					{
						pigs[curp].global_id = 1;
					}
					
					return !use_wxkj(curp, 2);
				}
			}
		}
		else if (pigs[curp].id == 2 && sit == 2)
		{
			for (int i = 1; i <= pigs[curp].used_card; i++)
			{
				if (pigs[curp].cards[i] == 'J' && !pigs[curp].is_used[i])
				{
					pigs[curp].is_used[i] = true;
					
					if (pigs[curp].global_id != 1)
					{
						pigs[curp].global_id = 1;
					}
					
					return !use_wxkj(curp, 1);
				}
			}
		}
		
		curp = pigs[curp].next;
	}
	while (curp != cur);
	
	return false;
}

bool use_zgln(int cur)
{
	pigs[cur].zb = true;
	return true;
}

bool use_nmrq(int cur)
{
	for (int i = pigs[cur].next; i != cur; i = pigs[i].next)
	{
		bool used_kill = false;
		
		if (pigs[i].global_id == 1)
		{
			if (use_wxkj(cur, pigs[i].id == 0 ? 1 : pigs[i].id))
			{
				continue;
			}
		}
		
		for (int j = 1; j <= pigs[i].used_card; j++)
		{
			if (pigs[i].cards[j] == 'K' && !pigs[i].is_used[j])
			{
				pigs[i].is_used[j] = true;
				used_kill = true;
				break;
			}
		}
		
		if (!used_kill)
		{
			if (pigs[i].hp <= 0)
			{
				die(i, cur);
			}
			
			if (i == 1 && pigs[cur].global_id == 0)
			{
				pigs[cur].global_id = 2;
			}
			
			if (res != -1)
			{
				return true;
			}
		}
	}
	
	return true;
}

bool use_wjqf(int cur)
{
	for (int i = pigs[cur].next; i != cur; i = pigs[i].next)
	{
		bool used_kill = false;
		
		if (pigs[i].global_id == 1)
		{
			if (use_wxkj(cur, pigs[i].id == 0 ? 1 : pigs[i].id))
			{
				continue;
			}
		}
		
		for (int j = 1; j <= pigs[i].used_card; j++)
		{
			if (pigs[i].cards[j] == 'D' && !pigs[i].is_used[j])
			{
				pigs[i].is_used[j] = true;
				used_kill = true;
				break;
			}
		}
		
		if (!used_kill)
		{
			if (pigs[i].hp <= 0)
			{
				die(i, cur);
			}
			
			if (i == 1 && pigs[cur].global_id == 0)
			{
				pigs[cur].global_id = 2;
			}
			
			if (res != -1)
			{
				return true;
			}
		}
	}
	
	return true;
}

2024/5/3 11:07
加载中...