全 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;
}