```cpp
void duel(int now,int target){
if(id[target][0]=='Z'&&now==1){
hp[target]--;
if(!hp[target])
die(target,now);
return ;
}
bool flag=0;
if(tz[target]||tf[target]||target==1)
for(int i=now%n+1;i!=now;i=i%n+1){
int x=findcard(i,'J');
if(target==1||tz[target]){
if(id[i][0]=='F'&&flag){
tf[i]=1;
flag^=1;
card[i][x]='\0';
}
else if((id[i][0]=='Z'||i==1)&&!flag){
tz[i]=1;lf[i]=0;
flag^=1;
card[i][x]='\0';
}
}
else if(tf[target]){
if(id[i][0]=='F'&&!flag){
tf[i]=1;
flag^=1;
card[i][x]='\0';
}
else if(id[i][0]=='Z'&&flag){
tz[i]=1;lf[i]=0;
flag^=1;
card[i][x]='\0';
}
}
}
if(flag)
return ;
while(1){
int x=findcard(now,'K'),y=findcard(target,'K');
if(y==-1){
hp[target]--;
if(!hp[target]){
die(target,now);
break;
}
}
card[target][y]='\0';
if(x==-1){
hp[now]--;
if(!hp[now]){
die(now,target);
break;
}
}
card[now][x]='\0';
}
}
void avoid(int target,int origin){
int x=findcard(target,'D');
if(x==-1){
hp[target]--;
if(!hp[target])
die(target,origin);
}
else card[target][x]='\0';
}
void print(){
if(!winner)
printf("MP\n");
else
printf("FP\n");
for(int i=1;i<=n;i++){
if(isdead[i]){
printf("DEAD\n");
continue;
}
for(int j=1;j<=top[i];j++)
if(card[i][j]!='\0')
printf("%c ",card[i][j]);
printf("\n");
}
/*while(!q.empty()){
printf("%c ",q.front());
q.pop();
}*/
}
int check(){
if(isdead[1]){
winner=1;
print();
return 1;
}
if(!cntf){
winner=0;
print();
return 0;
}
return 2;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",id[i]);
hp[i]=4;
if(id[i][0]=='F')
cntf++;
for(int j=0;j<4;j++){
top[i]++;
int v=top[i];
scanf(" %c",&card[i][v]);
}
}
for(int i=1;i<=m;i++){
char ch;
scanf(" %c",&ch);
q.push(ch);
}
int now=0;
while(1){
now=now%n+1;
if(isdead[now])
continue;
getcard(now,2);
while(hp[now]<4){
int x=findcard(now,'P');
if(x==-1)
break;
hp[now]++;
card[now][x]='\0';
if(x==top[now])
top[now]--;
}
while(1){
int x=findcard(now,'N');
if(x==-1)
break;
invade(now);
card[now][x]='\0';
if(x==top[now])
top[now]--;
}
if(check()<2)
break;
while(1){
int x=findcard(now,'W');
if(x==-1)
break;
arrows(now);
card[now][x]='\0';
if(x==top[now])
top[now]--;
}
if(check()<2)
break;
while(1){
int x=findcard(now,'Z');
if(x==-1)
break;
crossbow[now]=1;
card[now][x]='\0';
}
for(int i=now%n+1;i!=now;i=i%n+1){
if(finddis(now,i)==1&&((id[now][0]=='F'&&(tz[i]||i==1))||((id[now][0]=='Z')&&tf[i])||(now==1&&(tf[i]||lf[i])))){
int x=findcard(now,'K');
if(x==-1)
break;
if(id[now][0]=='F'){
card[now][x]='\0';
tf[now]=1;
avoid(i,now);
if(crossbow[now])
while(hp[i]){
x=findcard(now,'K');
if(x==-1)
break;
card[now][x]='\0';
avoid(i,now);
}
}
if(id[now][0]=='Z'){
tz[now]=1;lf[now]=0;
card[now][x]='\0';
avoid(i,now);
if(crossbow[now])
while(hp[i]){
x=findcard(now,'K');
if(x==-1)
break;
card[now][x]='\0';
avoid(i,now);
}
}
if(now==1){
card[now][x]='\0';
avoid(i,now);
if(crossbow[now])
while(hp[i]){
x=findcard(now,'K');
if(x==-1)
break;
card[now][x]='\0';
avoid(i,now);
}
}
}
}
if(check()<2)
break;
for(int i=now%n+1;i!=now;i++)
if(finddis(now,i)==1&&((id[now][0]=='F'&&(tz[i]||i==1))||((id[now][0]=='Z')&&tf[i])||(now==1&&(tf[i]||lf[i])))){
if(id[now][0]=='F')
tf[now]=1;
if(id[now][0]=='Z'){
tz[now]=1;
lf[now]=0;
}
while(findcard(now,'F')!=-1&&hp[i]){
duel(now,i);
if(isdead[now])
break;
}
if(isdead[now])
break;
}
if(check()<2)
break;
}
return 0;
}
by _gifbmp @ 2019-08-21 10:51:37
波浪代码就很美
by OvOAuto @ 2019-08-21 10:54:14
去你的刚学OI
by FZzzz @ 2019-08-21 10:57:40
~~qndmx~~
~~qndmz~~
~~oi没有maze~~
by CodeKnight @ 2019-08-21 11:11:47
刚学OI好评
by ZigZagKmp @ 2019-08-21 11:12:00
信哦,大佬orzorzorz%%%
by nju_zdd @ 2019-08-21 11:12:10
GXOIZZGSTQL
by 览遍千秋 @ 2019-08-21 11:12:24
当代臭恶男青年三连:刚学OI,妹子,萌新求助
by s_ShotღMaki @ 2019-08-21 11:13:20
您好,为什么要强调你是妹子呢?
by Smile_Cindy @ 2019-08-21 11:14:31
这题不是很水的吗(逃
by 森岛帆高 @ 2019-08-21 12:14:41