记录编号 550506 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [SDOI 2010] 猪国杀 最终得分 100
用户昵称 Gravatar老霍铁粉 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2020-03-10 18:56:05 内存使用 0.68 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct node{
	int HP;	//血量
	int number;	//手牌数量
	bool zhuge;	//是否装备诸葛 
	int last;	//上一个玩家的位置 
	int next;	//下一个玩家的位置 
	char ID;	//身份 
	char card[2010];	//手牌 
}pig[11];	//每只猪的东西 
char paidui[2010];	//牌堆 
char eye[11];	//主猪眼中i号猪的身份 
int n,m;	//输入数据 
int FP;	//反猪的数量 
bool over;	//游戏是否结束 
void MP(int man){	//摸牌(man指要摸的猪) 
    pig[man].number++;
	pig[man].card[pig[man].number]=paidui[m];
    if(m>1)
		m--;
}
void JS(int ing,int ed){	//判断是否被击杀(ing指杀猪者,ed指虚血者) 
	for(int i=1;i<=pig[ed].number;i++){
		if(pig[ed].card[i]=='P'){	//要吃活了
			pig[ed].card[i]='U';
			pig[ed].HP++;
			return;
		}
	}
	pig[pig[ed].next].last=pig[ed].last;	//改变距离 
	pig[pig[ed].last].next=pig[ed].next;
    if(pig[ed].ID=='M'){
    	over=true;
    	return;
	}
	if(pig[ed].ID=='F'){
		FP--;
		if(!FP){
			over=true;
			return;
		}
		for(int i=1;i<=3;i++)	//猪猪击杀反猪的奖励(摸牌) 
			MP(ing);
	}
	if(pig[ed].ID=='Z'){	//忠猪被杀 
		if(pig[ing].ID=='M'){	//主猪击杀忠猪的奖励(弃牌) 
			pig[ing].number=0;
			pig[ing].zhuge=false; 
		}
	}
}
bool WX(int ing,int ed,bool fu){	//ing为要使用锦囊的猪,ed为要使用无懈的猪,当fu=1或0时指找与ed同种或非同种的猪 
    int i=ing;	//i指将要查看的猪 
    while(1){
        if(fu){	//找同种的猪 
            if(eye[ed]==pig[i].ID||(eye[ed]=='M'&&pig[i].ID=='Z')||(eye[ed]=='Z'&&pig[i].ID=='M')){
                for(int j=1;j<=pig[i].number;j++){
                    if(pig[i].card[j]=='J'){
                        pig[i].card[j]='U';
                        eye[i]=pig[i].ID;
                        return !WX(i,ing,0);
                    }
                }
            }
        }
        else{	//找非同种的猪 
            if(((pig[i].ID=='M'||pig[i].ID=='Z')&&eye[ing]=='F')||(pig[i].ID=='F'&&(eye[ing]=='M'||eye[ing]=='Z'))){
                for(int j=1;j<=pig[i].number;j++){
                    if(pig[i].card[j]=='J'){
                        pig[i].card[j]='U';
                        eye[i]=pig[i].ID;
                        return !WX(i,ing,0);
                    }
				}
			}
		}
        i=pig[i].next;
        if(i==ing)	//没找到 
			return false;
    }
}
void CZ(int ing,int ed){	//杀猪(ing为杀猪的猪,ed为被杀的猪) 
	for(int i=1;i<=pig[ed].number;i++){	//开始找闪避 
		if(pig[ed].card[i]=='D'){
			pig[ed].card[i]='U';
			return;
		}
	}
	pig[ed].HP--;
	if(!pig[ed].HP)
		JS(ing,ed);
}
void JD(int ing,int ed){	//决斗(ing为发起决斗的猪,ed为被决斗的猪) 
	if(pig[ing].ID=='M'&&pig[ed].ID=='Z'){
        pig[ed].HP--;
        if(!pig[ed].HP)
			JS(ing,ed);
        return;
    }
    if(WX(ing,ed,1))
		return;
	int i,j;
	i=j=1;
    while(1){	//开始死斗 
        while(pig[ed].card[i]!='K'&&i<=pig[ed].number)	//被决斗的猪开始杀猪 
			i++;
        if(i>pig[ed].number){
            pig[ed].HP--;
            if(!pig[ed].HP)
				JS(ing,ed);
            return;
        }
        pig[ed].card[i]='U';
        while(pig[ing].card[j]!='K'&&j<=pig[ing].number)	//发起决斗的猪开始杀猪
			j++;
        if(j>pig[ing].number){
            pig[ing].HP--;
            if(!pig[ing].HP)
            	JS(ed,ing);
            return;
        }
        pig[ing].card[j]='U';
    }
}
void NM(int man){	//南蛮(man指发起南蛮的猪) 
	for(int i=pig[man].next;i!=man;i=pig[i].next){	//开始轮流杀猪 
		if(WX(man,i,1))
			continue;
		int j;
		for(j=1;j<=pig[i].number;j++){
			if(pig[i].card[j]=='K'){
				pig[i].card[j]='U';
				break;
			}
		}
		if(j>pig[i].number){
			pig[i].HP--;
			if(pig[i].ID=='M'&&eye[man]=='U'){
				eye[man]='L';
			} 
			if(!pig[i].HP){
				JS(man,i);
				if(over)
					return;
			} 
		}
	}
}
void WJ(int man){	//万贱(man指发起万贱的猪) 
	for(int i=pig[man].next;i!=man;i=pig[i].next){	//开始轮流闪避 
		if(WX(man,i,1))
			continue;
		int j;
		for(j=1;j<=pig[i].number;j++){
			if(pig[i].card[j]=='D'){
				pig[i].card[j]='U';
				break;
			}
		}
		if(j>pig[i].number){
			pig[i].HP--;
			if(pig[i].ID=='M'&&eye[man]=='U'){
				eye[man]='L';
			} 
			if(!pig[i].HP){
				JS(man,i);
				if(over)
					return;
			} 
		}
	}
}
void begin(){	//开始玩游戏 
	over=true;
	if(FP)
		over=false;
	if(over)
		return;
	for(int i=1;i;i=pig[i].next){
		for(int j=1;j<=2;j++)	//摸牌 
			MP(i);
		bool use=false;	//是否已经杀猪 
		for(int j=1;j<=pig[i].number;j++){	//出牌 
			if(pig[i].card[j]=='U')
				continue;
			if(!pig[i].HP)	//死亡 
				break;
			if(pig[i].HP<4&&pig[i].card[j]=='P'){	//吃桃 
				pig[i].HP++;
				pig[i].card[j]='U';
				continue;
			}
			if(pig[i].card[j]=='K'){	//杀猪 
				if(use&&!pig[i].zhuge)
					continue;
				if(pig[i].ID=='M'&&eye[pig[i].next]!='L'&&eye[pig[i].next]!='F')
					continue;
				if(pig[i].ID=='Z'&&eye[pig[i].next]!='F')
					continue;
				if(pig[i].ID=='F'&&eye[pig[i].next]!='Z'&&eye[pig[i].next]!='M')
					continue;
				pig[i].card[j]='U';
				CZ(i,pig[i].next);
				eye[i]=pig[i].ID;
				use=true;
				if(over)
					return;
			}
			if(pig[i].card[j]=='F'){	//决斗 
				if(pig[i].ID=='F'){	//反猪发起决斗 
					pig[i].card[j]='U';
					JD(i,1);	//反猪专打主猪 
					eye[i]=pig[i].ID;	//跳反 
				}
				if(pig[i].ID=='M'){	//主猪发起决斗 
					for(int k=pig[i].next;k!=i;k=pig[k].next){	//主猪专打(类)反猪 
						if(eye[k]=='L'||eye[k]=='F'){
							pig[i].card[j]='U';
							JD(i,k);
							eye[i]=pig[i].ID;	//跳忠 
							j=0;
							break;
						}
					}
				}
				if(pig[i].ID=='Z'){	//忠猪发起决斗 
					for(int k=pig[i].next;k!=i;k=pig[k].next){	//忠猪专打反猪 
						if(eye[k]=='F'){
							pig[i].card[j]='U';
							JD(i,k);
							eye[i]=pig[i].ID;	//跳忠 
							j=0;
							break;
						}
					}	
				}
				if(over)
					return;
				continue;
			}
			if(pig[i].card[j]=='N'){	//南蛮 
				pig[i].card[j]='U';
				NM(i);
				if(over)
					return;
				j=0;
				continue;
			}
			if(pig[i].card[j]=='W'){	//万贱 
				pig[i].card[j]='U';
				WJ(i);
				if(over)
					return;
				j=0;
				continue;
			}
			if(pig[i].card[j]=='Z'){	//诸葛 
				pig[i].zhuge=true;
				pig[i].card[j]='U';
				if(use){
					use=false;
					j=0;
				}
				continue;
			}
		}
	}
}
int Main(){	//准备工作 
	freopen("kopk.in","r",stdin);
	freopen("kopk.out","w",stdout);
	scanf("%d %d\n",&n,&m);
	for(int i=1;i<=n;i++){	//标明距离 
		pig[i].last=i-1;
		pig[i].next=i+1;
	}
	pig[1].last=n;
	pig[n].next=1;
	for(int i=1;i<=n;i++){
		eye[i]='U';
		for(int j=1;j<=m;j++)
			pig[i].card[j]='U';
	}
	eye[1]='M';
	for(int i=1;i<=n;i++){
		char fu[2];
		scanf("%s %c %c %c %c\n",fu,&pig[i].card[1],&pig[i].card[2],&pig[i].card[3],&pig[i].card[4]);
		pig[i].ID=fu[0];
		pig[i].number=pig[i].HP=4;
		pig[i].zhuge=false;
		if(pig[i].ID=='F')
			FP++;
	}
	for(int i=1;i<m;i++){
		scanf("%c ",&paidui[m-i+1]);
	}scanf("%c",&paidui[1]);
	begin();
	if(!pig[1].HP)
		printf("FP\n");
	else printf("MP\n");
	for(int i=1;i<=n;i++){
		if(pig[i].HP<=0)	//战死沙场 
			printf("DEAD");
		else{	//亮牌 
			for(int j=1;j<=pig[i].number;j++)
				if(pig[i].card[j]!='U')
					printf("%c ",pig[i].card[j]);
		}
		printf("\n");
	}
	return 0;
}
int yy=Main();
int main(){;}