35pts求条
查看原帖
35pts求条
572587
cmrhhh楼主2024/7/31 19:26

测评记录

代码:

/*
基本牌:桃 P 杀 K 闪 D
锦囊牌:决斗 F  南猪入侵 N 万箭齐发 W 无懈可击 J
装备牌:猪哥连弩 Z 
自己造的:E empty 表示空牌 

hostility 表敌意:对某个角色使用杀、决斗;使用无懈可击抵消献殷勤;
complaisance 献殷勤:使用无懈可击挡下南猪入侵、万箭齐发、决斗;使用无懈可击抵消表敌意;
跳忠:通过行动表示自己是忠猪。对主猪或对某只已经跳忠的猪献殷勤,或者对某只已经跳反的猪表敌意;
跳反:通过行动表示自己是反猪。对主猪或对某只已经跳忠的猪表敌意,或者对某只已经跳反的猪献殷勤。
忠猪不会跳反,反猪也不会跳忠;不管是忠猪还是反猪,能够跳必然跳。
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define pii pair<int,int>
const int maxn=12,maxm=8e4+10; 
int n,m;
int fz_tot;//反猪数量 
int ed=0;//2反贼赢 1忠猪赢 
struct IDcard{
	int id;//编号顺序 
	int nxt,pre;//前后  双向链表维护 
	string cst;//身份成分constituent
	char card[maxm];//牌堆 
	int card_tot;//牌数 
	bool zgln;//是否配备猪哥连弩
	int hp;//血量
	bool die;//是否死掉
	bool at;//Anti thief 是否跳反
	bool ol;//official loyal to his sovereign 是否跳忠 
	bool sim;//是否是类反猪 
}pig[maxn];
queue<char>card_heap;
void init(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>pig[i].cst;
		if(pig[i].cst=="FP")fz_tot++; 
		pig[i].card_tot=0;
		pig[i].id=i;
		pig[i].hp=4;
		pig[i].zgln=0;
		pig[i].nxt=i+1;
		pig[i].pre=i-1;
		pig[i].sim=0;
		pig[i].at=0;
		pig[i].ol=0; 
		pig[i].die=0;
		for(int j=1;j<=2000;++j)pig[i].card[j]='E';
		for(int j=1;j<=4;++j){
			cin>>pig[i].card[++pig[i].card_tot];
			if(pig[i].card[pig[i].card_tot]=='Z') pig[i].zgln=1,pig[i].card[pig[i].card_tot]='E';
		}
	}
	pig[1].pre=n;
	pig[n].nxt=1;
	for(int i=1;i<=m;++i){
		char pai;
		cin>>pai;
		card_heap.push(pai);
	}
	pig[1].ol=1;
}
void get_card(int x){
	if(card_heap.size()==1)card_heap.push(card_heap.front());
	pig[x].card[++pig[x].card_tot]=card_heap.front();
	if(pig[x].card[pig[x].card_tot]=='Z')pig[x].zgln=1,pig[x].card[pig[x].card_tot]='E';
	card_heap.pop();
}
void js(int x,int s){//x hp<=0时,s伤害来源  
	for(int i=1;i<=pig[x].card_tot;++i){
		if(pig[x].card[i]=='P'){
			pig[x].hp++;
			pig[x].card[i]='E';
		}
		if(pig[x].hp>=1)return ;
	}
	pig[x].die=1;
	int nxt=pig[x].nxt;
	int pre=pig[x].pre;
	pig[pre].nxt=nxt;
	pig[nxt].pre=pre;
	if(pig[x].cst=="FP")fz_tot--;
	if(pig[x].cst=="MP"){ed=2;return ;}
	if(!fz_tot){ed=1;return ;}
	if(pig[x].cst=="FP")get_card(x),get_card(x),get_card(x);
	if(pig[x].cst=="ZP"&&pig[s].cst=="MP"){
		pig[s].zgln=0;
		pig[s].card_tot=0;
	}
}
void use_K(int u,int v){//u 对 v 使用 K
	//表敌意 
	if(pig[v].cst=="MP")pig[u].at=1,pig[u].sim=0;
	if(pig[v].at)pig[u].ol=1,pig[u].sim=0;
	if(pig[v].ol)pig[u].at=1,pig[u].sim=0;
	for(int i=1;i<=pig[v].card_tot;++i){
		if(pig[v].card[i]=='D'){
			pig[v].card[i]='E';
			return ;
		}
	}
	pig[v].hp--;
	if(!pig[v].hp)js(v,u);
}
bool wxkj(int x1,int x2){//X1对x2打出一张牌 判断有无 无懈掉 
	int i=x2;
	while(pig[x2].at||pig[x2].ol){//没有亮明 队友(自己)不无懈 
		if((pig[i].cst=="FP"&&pig[x2].at)||(pig[i].cst=="ZP"&&pig[x2].ol)||(pig[i].cst=="MP"&&pig[x2].ol)){//敌对阵营 
			for(int j=1;j<=pig[i].card_tot;++j){
				if(pig[i].card[j]=='J'){
					pig[i].card[j]='E';
					if(pig[x1].at)pig[i].ol=1;
					if(pig[x1].ol)pig[i].at=1;
					if(pig[x2].ol)pig[i].ol=1;
					if(pig[x2].at)pig[i].at=1;
					return !wxkj(i,x1);
				}
			}
		}
		i=pig[i].nxt;
		if(i==x1)break;
	} 
	return 0;
}
void jd(int x1,int x2){//x1对x2决斗
	if(pig[x2].at)pig[x1].ol=1;
	if(pig[x2].ol)pig[x1].at=1;
	if(x2==1)pig[x1].at=1;
	if(wxkj(x1,x2))return ;//被无懈了
	if(pig[x2].cst=="ZP"&&x1==1){
		pig[x2].hp--;
		if(!pig[x2].hp)js(x2,1);
		return ;
	}
	int i=1,j=1;
	pig[x2].card[pig[x2].card_tot+1]='E';
	pig[x1].card[pig[x1].card_tot+1]='E';
	while(1){
		while(pig[x2].card[j]!='K'&&j<=pig[x2].card_tot+2)j++;
		if(j>pig[x2].card_tot){
			pig[x2].hp--;
			if(pig[x2].hp<=0)js(x2,x1);
			return ;
		}else {
			pig[x2].card[j]='E';
		}
		while(pig[x1].card[i]!='K'&&i<=pig[x1].card_tot+2)i++;
		if(i>pig[x1].card_tot){
			pig[x1].hp--;
			if(pig[x1].hp<=0)js(x1,x2);
			return ;
		}else {
			pig[x1].card[i]='E';
		}
	}
}
void nzrq(int x1){//此处无懈可击仅对 1 个角色产生效果
	for(int x2=pig[x1].nxt;x2!=x1;x2=pig[x2].nxt){
		bool flg=0;
		if(wxkj(x1,x2))continue;
		for(int i=1;i<=pig[x2].card_tot;++i){
			if(pig[x2].card[i]=='K'){
				pig[x2].card[i]='E';
				flg=1;
				break ;
			}
		}
		if(flg)continue;
		pig[x2].hp--;
		if(x2==1)pig[x1].sim=1;//造成伤害,类反 
		if(pig[x2].hp<=0)js(x2,x1);
	}
}
void wjqf(int x1){//此处无懈可击仅对 1 个角色产生效果 
	for(int x2=pig[x1].nxt;x2!=x1;x2=pig[x2].nxt){
		bool flg=0;
		if(wxkj(x1,x2))continue;
		for(int i=1;i<=pig[x2].card_tot;++i){
			if(pig[x2].card[i]=='D'){
				pig[x2].card[i]='E';
				flg=1;
				break;
			}
		}
		if(flg)continue;
		pig[x2].hp--;
		if(x2==1)pig[x1].sim=1;
		if(pig[x2].hp<=0)js(x2,x1);
	}
}
void Ett(){
	int x=1;//当前回合决策猪 
	while(!ed){
		get_card(x);get_card(x);//回合摸牌阶段 
		int K_cnt=0;
		for(int i=1;i<=pig[x].card_tot;++i){
			if(ed)return ;
			if(pig[x].card[i]=='P'){
				if(pig[x].hp!=4){
					pig[x].hp++;
					pig[x].card[i]='E';
				}
				continue;
			}
			if(pig[x].card[i]=='K'){
				if(K_cnt<1||pig[x].zgln){
					int target=pig[x].nxt;
					if(pig[x].cst=="MP"&&((pig[target].at&&pig[target].cst=="FP")||(pig[target].sim&&pig[target].at==0&&pig[target].ol==0))){
						pig[x].card[i]='E';
						pig[x].sim=0;
						use_K(x,target);
						K_cnt++;
					}
					if(pig[x].cst=="FP"&&((pig[target].ol&&pig[target].cst=="ZP")||pig[target].cst=="MP")){
						pig[x].at=1;
						pig[x].sim=0;
						pig[x].card[i]='E';
						use_K(x,target);
						K_cnt++;
					}
					if(pig[x].cst=="ZP"&&pig[target].at&&pig[target].id!=1){
						pig[x].ol=1;
						pig[x].sim=0;
						pig[x].card[i]='E';
						use_K(x,target);
						K_cnt++;
					}
				}
				if(ed)return ;
				continue;
			}
			if(pig[x].card[i]=='F'){//duel
				if(pig[x].cst=="FP"){//have the chance of juedou MP!!
					pig[x].at=1;//跳反
					pig[x].sim=0;
					pig[x].card[i]='E';
					jd(x,1);
					i=0;//发牌后可能激活前面的牌 
					if(ed)return ;
					continue;
				}
				else{
					int bdy=pig[x].nxt;
					while(bdy!=x){
							if((pig[x].cst=="MP"&&((pig[bdy].at&&pig[bdy].cst=="FP")||(pig[bdy].sim&&pig[bdy].at==0&&pig[bdy].ol==0)))
							||(pig[x].cst=="ZP"&&pig[bdy].at&&pig[bdy].cst=="FP"))
							{
								pig[x].ol=1;//跳忠 (1没事)
								pig[x].sim=0;
								pig[x].card[i]='E';
								jd(x,bdy);
								i=0;//发牌后可能激活前面的牌 
								if(ed)return ;
								break;
							}
						bdy=pig[bdy].nxt;
					}
				}
				continue;
			}
			if(pig[x].card[i]=='N'){//South pig in=vade
				pig[x].card[i]='E';
				nzrq(x);
				i=0;//发牌后可能激活前面的牌 
				if(ed)return ;
				continue;
			}
 			if(pig[x].card[i]=='W'){//Ten thousand arrows shot at once. 
				pig[x].card[i]='E';
 				wjqf(x);
				i=0;//发牌后可能激活前面的牌 
				if(ed)return ;
				continue;
			}
		}
		x=pig[x].nxt;
	}
}
void Sa(){
	if(ed==1)cout<<"MP\n";
	else cout<<"FP\n";
	for(int i=1;i<=n;++i){
		if(pig[i].die)cout<<"DEAD\n";
		else{
			for(int j=1;j<=pig[i].card_tot;++j)if(pig[i].card[j]!='E')cout<<pig[i].card[j]<<" ";
			cout<<"\n";
		}
	}
}
int main(){
//	ios::sync_with_stdio(0),cin.tie(0);
	init();
	Ett();//Enter the turn
	Sa();//settle accounts 清算 
	return 0;
}
/*
6 20
MP K W Z Z
FP N K K K
ZP N P N J
FP J Z J K
ZP J W K D
ZP N P K P
J P F K P K F J N W W W N K D D K D D J
*/
/*
FP
DEAD
 

DEAD
W W
N
*/
/*
3 7
MP P K K K
FP N W K P
ZP W F D P
P F P D K K F
*/
/*
MP

DEAD
K K F
*/
2024/7/31 19:26
加载中...