#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int n,m;//猪的数量和牌堆大小
int ident[15];//**表明的**身份
//0:未表明身份
//1:忠(主)猪
//2:反猪
//3:类反猪
bool life[15];//是否存活
int freba;//存活的反猪数量
queue<char> pokerheap;//牌堆
char mp(void){
char res=pokerheap.front();
if(pokerheap.size()!=1){
pokerheap.pop();
}
return res;
}
bool southpig,tsarrow;//是否有未处理完的南猪入侵或万箭齐发
int spwho=-1 ,tsawho=-1;//发起南猪入侵或万箭齐发的猪
class mainpigdie{
public:
mainpigdie(){}
~mainpigdie(){}
private:
;
};
class frebaalldie{
public:
frebaalldie(){}
~frebaalldie(){}
private:
;
};
class pig{//猪
public:
pig(int Id=0,string l="",char a='a',char b='a',char c='a',char d='a'){
id=Id;
blood=4;
kind=l[0];
if(kind=='M')ident[id]=1;
life[id]=1;
start=0;
pigbrother=0;
alreadykill=0;
poker.push_back(a);
poker.push_back(b);
poker.push_back(c);
poker.push_back(d);
number[a]++;
number[b]++;
number[c]++;
number[d]++;
}
~pig(){}
void mp(int num/*摸牌张数*/){
while(num--){
char t=::mp();
poker.push_back(t);
number[t]++;
}
}
void cp(void);
void printpoker(void){//打印手牌
for(int i=start;i<poker.size();i++){
if(poker[i]!='Q')cout<<poker[i];
}
cout<<endl;
}
private:
void selfdie(int who);
void delpoker(int i){//删除一张牌
number[poker[i]]--;
poker[i]='Q';
if(start==i)start++;
}
void delblood(int d,int who){
blood-=d;
if(number['P']+blood<=0)this->selfdie(who);//桃不够
number['P']=0;
for(int i=start;i<poker.size();i++){
if(poker[i]=='P')delpoker(i);
}
}
void beingkill(int who){
if(!number['D']){
delblood(1,who);
return;
}
for(int i=start;i<poker.size();i++){
if(poker[i]=='D'){
delpoker(i);
break;
}
}
}
int id;//序号
char kind;//类型
//M:主猪Z:忠猪F:反猪
bool pigbrother;//是否**装备**猪哥连弩
vector<char> poker;//手牌
//'Q'表示此处手牌已被使用
int start;//第一张有效手牌位置
map<char,int> number;
//每一种牌的数量
int blood;//体力
bool alreadykill;//是否已经在本回合出杀
}pigs[15];
void pig::selfdie(int who){
life[id]=0;
if(kind=='M'){
throw mainpigdie();
}else if(kind=='F'){
pigs[who].mp(3);
freba--;
if(!freba){
throw frebaalldie();
}
}else{
if(pigs[who].kind=='M'){
pigs[who].poker=vector<char>();
pigs[who].number=map<char,int>();
pigs[who].start=0;
pigs[who].pigbrother=0;
}
}
}
void pig::cp(void){
for(int i=start;i<poker.size();i++){
if(poker[i]=='D'||poker[i]=='J'||poker[i]=='Q')continue;//闪和无懈不能先手出
if(poker[i]=='P'){//桃
if(blood<4){
blood++;
poker[i]--;
delpoker(i);
}
}else if(poker[i]=='K'){//杀
if(alreadykill&&!pigbrother)continue;//已经出杀,还没有诸葛连弩
if(kind=='M'){
int j=id;
for(;j!=id;j++){
if(j==n+1)j=1;
if(life[j])break;
}
if(ident[j]==2||ident[j]==3){
delpoker(i);
pigs[j].beingkill(id);
}
}else if(kind=='Z'){
int j=id;
for(;j!=id;j++){
if(j==n+1)j=1;
if(life[j])break;
}
if(ident[j]==2){
delpoker(i);
pigs[j].beingkill(id);
}
}else if(kind=='F'){
int j=id;
for(;j!=id;j++){
if(j==n+1)j=1;
if(life[j])break;
}
if(ident[j]==1){
delpoker(i);
pigs[j].beingkill(id);
}
}
}else if(poker[i]=='Z'){
pigbrother=1;
delpoker(i);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
char a,b,c,d;
cin>>s>>a>>b>>c>>d;
pigs[i]=pig(i,s,a,b,c,d);
}
for(int i=1;i<=m;i++){
char t;
cin>>t;
pokerheap.push(t);
}
try{
for(int i=1;;i++){
if(i==n+1)i=1;
if(!life[i])continue;
pigs[i].mp(2);
pigs[i].cp();
}
}catch(mainpigdie& m){
cout<<"FP";
}catch(frebaalldie& f){
cout<<"MP";
}
for(int i=1;i<=n;i++){
if(!life[i]){
cout<<"DEAD\n";
continue;
}
pigs[i].printpoker();
}
return 0;
}
/*
3 10
MP Z K K D
ZP Z K K K
FP K K K P
K K D D Z Z P D K K
*/
自测数据:
2 5
MP Z K K K
FP Z Z Z Z
K P K Z K
刚把主猪的牌输入完,就不接受输入了,过一会儿异常结束。