RT 死循环
#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(l,val) memset((l),(val),(sizeof(l)))
using namespace std;
const int INF = 0x3f3f3f3f;
char pig[15][4005]; //手牌
stack <char> card; //牌堆
string op[15]; //身份
int hp[15],n,m,tmp,down[15]; //血量 牌的下标
bool die[15],worse[15],bad[15],good[15],used[15],god[15]; //死亡标志 类反猪标志 跳反标志 跳忠标志 用没用过杀 有没有武器
char x; //temp
inline void take(int x,int num) //摸num张牌
{
while(num--)
{
pig[x][++down[x]] = card.top();
if(card.size() != 1) card.pop();
}
}
inline int check() //判断游戏是否结束 0是未结束 1是结束且主猪胜利 2是结束且反猪胜利
{
if(die[1]) return 2;
for(int i = 2;i <= n;++i)
if(!die[i] && op[i][0] == 'F') return 0;
return 1;
}
inline void write(int res) //根据结果输出
{
if(res == 1) puts("MP");
else puts("FP");
for(int i = 1;i <= n;++i)
{
if(die[i]) {puts("DEAD");continue;}
for(int j = 1;j <= down[i];++j)
if(pig[i][j] != '0') cout<<pig[i][j]<<" ";
puts("");
}
}
inline int kill(int a,int b) //第a只猪杀第b只猪
{
for(int i = 1;i <= down[b];++i)
if(pig[b][i] == 'D') {pig[b][i] = '0';return 0;}
--hp[b];
if(hp[b] <= 0)
{
for(int i = 1;i <= down[b];++i)
if(pig[b][i] == 'P') {pig[b][i] = '0';++hp[b];return 0;}
die[b] = 1;
if(op[b][0] == 'F') take(a,3);
else if(op[b][0] == 'Z' && op[a][0] == 'M')
{
god[a] = 0;
for(int i = 1;i <= down[a];++i) pig[a][i] = '0';
}
int ch = check();
if(ch) {write(ch);exit(0);}
}
return 0;
}
inline void show(int x,int y) //打第x只猪的第y张牌,即pig[x][y]
{
if(pig[x][y] == 'P' && hp[x] < 4) {++hp[x];pig[x][y] = '0';}
if(pig[x][y] == 'Z') {god[x] = 1;pig[x][y] = '0';}
if(pig[x][y] == 'K' && (!used[x] || god[x]))
{
int goal = (x+1)%n;
if(x+1 == n) goal = n;
while(die[goal]) goal = (goal+1)%n;
if(op[x][0] == 'M' && (bad[goal] || worse[goal]))
tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0';
if(op[x][0] == 'Z' && bad[goal])
tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0',good[x] = 1;
if(op[x][0] == 'F' && good[goal])
tmp = kill(x,goal),used[x] = 1,pig[x][y] = '0',bad[x] = 1;
}
}
int main(int argc,char *argv[])
{
//freopen("data.ans","r",stdin);
//freopen("data.out","w",stdout);
scanf("%d%d",&n,&m);
fill(hp+1,hp+n+1,4);
good[1] = 1;
for(int i = 1;i <= n;++i)
for(int j = 0;j < 4005;++j) pig[i][j] = '0';
for(int i = 1;i <= n;++i)
{
cin>>op[i];
for(int j = 0;j < 4;++j) {cin>>pig[i][++down[i]];}
}
for(int i = 1;i <= m;++i) {cin>>x;card.push(x);}
while(1)
{
for(int i = 1;i <= n;++i)
{
used[i] = 0;
take(i,2);
for(int j = 1;j <= down[i];++j)
if(pig[i][j] != '0') show(i,j);
}
}
return 0;
}/*
3 1
MP K K K K
ZP K K K K
FP K K K K
K */