50分求调
查看原帖
50分求调
761179
Mathhew楼主2025/8/31 19:44
#include"bits/stdc++.h" 
using namespace std;
struct node{
	int lastp;//最近伤害来源 
	bool zgln;
	bool dead; 
	int status;//主猪为1,忠为2,反为3
	string card;
	int blood;
	int cardcnt;
	int brightstatus;//主为1,跳忠为2,跳反为3,没跳为0 
	int beside;//注意这里距离只考虑逆时针(1与2距离1,2与1距离n-1)!!!!!!! 
}pig[20];
queue<char>cardq;
char lastcard;
bool gameend;
int n,m,now,f,leifan[20];
void end(bool winner){
	gameend=1;
	if(winner==0){
		cout<<"FP"<<endl;
	}
	else cout<<"MP"<<endl;
	for(int i=1;i<=n;i++){
		if(pig[i].dead) printf("DEAD\n");
		else{
			for(int j=1;j<=pig[i].cardcnt;j++){
				cout<<pig[i].card[j]<<' ';
			}
			cout<<endl;
		}
	}
	return;
}
void getcard(int x,int a){//让x号猪摸a张牌 
	for(int i=1;i<=a;i++){
		if(cardq.empty()) cardq.push(lastcard);
		pig[x].card+=cardq.front();
		pig[x].cardcnt++;
		cardq.pop();
	}
}
void gg(int x){//角色死亡
	pig[x].dead=1;
	if(pig[x].status==1){
		end(0);//主猪死亡,游戏结束
		return;
	}
	for(int i=1;i<=n;i++){
		if(pig[i].dead==0&&pig[i].beside==x){
			pig[i].beside=pig[x].beside;
			break;
		}
	}
	if(pig[x].status==3){
		f--;
		if(f==0){
			end(1);
			return;
		}
		getcard(pig[x].lastp,3);
	}//反猪死亡,最后伤害来源摸三张牌
	if(pig[x].status==2&&pig[x].lastp==1){
		pig[1].card.erase(1);
		pig[1].cardcnt=0;
		pig[1].zgln=0;
	}//忠猪gg 
}
void binsi(int x){//濒死结算 
	for(int i=1;i<=pig[x].cardcnt;i++){
		if(pig[x].card[i]=='P'){
			pig[x].card.erase(i,1);
			pig[x].cardcnt--;
			pig[x].blood++;
			if(pig[x].blood==1) return;//活过来了
		}
	}
	if(pig[x].blood<=0) gg(x);//没救过来,g了 
}
bool wuxie(int x,bool good){//good为0,无懈锦囊;good为1,无懈无懈(也可以理解为是否敌对)
	//执行下面判断的为反猪 
	if((pig[x].status==1||pig[x].brightstatus==2)&&good==1||pig[x].brightstatus==3&&good==0){
		for(int i=x,cnt=1;cnt<=n;i=pig[i].beside,cnt++){
			if(pig[i].status!=3) continue;
			if(pig[i].dead) continue;//死猪跳过
			for(int j=1;j<=pig[i].cardcnt;j++){
				if(pig[i].card[j]=='J'){
					pig[i].card.erase(j,1);
					pig[i].cardcnt--;
					pig[i].brightstatus=3;
					leifan[i]=0;
					return 1;
				}
			}
		}
	}
	//执行下面判断的为主猪或忠猪 
	else{
		for(int i=x,cnt=1;cnt<=n;i=pig[i].beside,cnt++){
			if(pig[i].status==3) continue;
			if(pig[i].dead) continue;//死猪跳过 
			for(int j=1;j<=pig[i].cardcnt;j++){
				if(pig[i].card[j]=='J'){
					pig[i].card.erase(j,1);
					pig[i].cardcnt--;
					if(pig[i].brightstatus!=1){
						leifan[i]=0;
						pig[i].brightstatus=2;
					}
					return 1;
				}
			}
		}
	}
	return 0;
}
void nanwan(int x,bool nw){//第x号猪用南蛮或万箭,南为0,万为1 
//	cout<<x<<' '<<"NW"<<endl;
//	cout<<pig[1].blood<<endl;
	for(int i=pig[x].beside;i!=x;i=pig[i].beside){
		if(pig[i].dead) continue;
		if(!nw){
			if(pig[i].brightstatus!=0){
				bool wx=wuxie(i,0),g=0;//g为0则还要出,g为1就不用 
				while(wx){
					g=!g;
					wx=wuxie(i,g);
				}
				if(g){
					continue;
				}
			}
			bool flag=0; 
			for(int j=1;j<=pig[i].cardcnt;j++){
				if(pig[i].card[j]=='K'){
					pig[i].card.erase(j,1);
					pig[i].cardcnt--;
					flag=1;
					break;
				}
			}
			if(flag==0){
				pig[i].blood--;
				pig[i].lastp=x;
				if(pig[i].blood<=0){
					binsi(i);
					if(gameend) return;
				}//打进濒死
				if(i==1){
					if(pig[x].brightstatus==0){
						leifan[x]=1;
					}//标为类反猪 
				}
			}
		}
		else{
			if(pig[i].brightstatus!=0){
				bool wx=wuxie(i,0),g=0;//g为0则还要出,g为1就不用 
				while(wx){
					g=!g;
					wx=wuxie(i,g);
				}
				if(g){
					continue;
				}
			}
			bool flag=0;
			for(int j=1;j<=pig[i].cardcnt;j++){
				if(pig[i].card[j]=='D'){
					pig[i].card.erase(j,1);
					pig[i].cardcnt--;
					flag=1;
					break;
				}
			}
			if(flag==0){
				pig[i].blood--;
				pig[i].lastp=x;
				if(pig[i].blood<=0){
					binsi(i);
					if(gameend) return;
				}//打进濒死
				if(i==1){
					if(pig[x].brightstatus==0){
						leifan[x]=1;
					}//标为类反猪 
				} 
			}
		}
	}
}
void juedou(int a,int b){//a对b用“决斗” 
//	cout<<a<<' '<<'F'<<' '<<b<<endl;
	if(pig[b].brightstatus==1||pig[b].brightstatus==2){
		pig[a].brightstatus=3;
		leifan[a]=0;
	}
	if(pig[b].brightstatus==3&&pig[a].brightstatus!=1){
		pig[a].brightstatus=2;
		leifan[a]=0;
	}
	bool g=0;//g为0则还要出,g为1就不用 
	if(pig[b].brightstatus!=0){
		bool wx=wuxie(b,0);
		while(wx){
			g=!g;
			wx=wuxie(b,g);
		}
		
	}
	if(g){
		return;
	}
	else{
		if(pig[a].status==1&&pig[b].status==2){
			pig[b].blood--;
			pig[b].lastp=a;
			if(pig[b].blood<=0) binsi(b);
		}
		else{
			bool who=1;
			while(1){
				if(who==0){
					bool flag=0;
					for(int i=1;i<=pig[a].cardcnt;i++){
						if(pig[a].card[i]=='K'){
							pig[a].card.erase(i,1);
							pig[a].cardcnt--;
							who=1;
							flag=1;
							break;
						}
					}
					if(!flag){
						pig[a].blood--;
						pig[a].lastp=b;
						if(pig[a].blood<=0){
							binsi(a);
							if(gameend) return;
						}
						return;
					}
				}
				else{
					bool flag=0;
					for(int i=1;i<=pig[b].cardcnt;i++){
						if(pig[b].card[i]=='K'){
							pig[b].card.erase(i,1);
							pig[b].cardcnt--;
							who=0;
							flag=1;
							break;
						}
					}
					if(!flag){
						pig[b].blood--;
						pig[b].lastp=a;
						if(pig[b].blood<=0){
							binsi(b);
							if(gameend) return;
						}
						return;
					}
				}
			}
		}
	}
}
void sha(int a,int b){//a对b出杀 
//	cout<<a<<' '<<'K'<<' '<<b<<endl;
	if(pig[b].brightstatus==1||pig[b].brightstatus==2){
		pig[a].brightstatus=3;
		leifan[a]=0;
	}
	if(pig[b].brightstatus==3&&pig[a].brightstatus!=1){
		pig[a].brightstatus=2;
		leifan[a]=0;
	}
	for(int i=1;i<=pig[b].cardcnt;i++){
		if(pig[b].card[i]=='D'){
			pig[b].card.erase(i,1);
			pig[b].cardcnt--;
			return;
		}
	}
	pig[b].blood--;
	pig[b].lastp=a;
	if(pig[b].blood<=0){
		binsi(b);
		if(gameend) return;
	}
}
void peach(int x){
//	cout<<x<<' '<<'P'<<endl;
	pig[x].blood++;
}
void huihe(int x){//x的回合 
//	cout<<x<<' '<<"have "<<pig[x].blood<<" blood"<<endl;
//	for(int i=1;i<=pig[x].cardcnt;i++) cout<<pig[x].card[i]<<' ';
//	cout<<endl;
	bool useK=0;
	getcard(x,2);
	for(int i=1;i<=pig[x].cardcnt;i++){
		if(gameend) return;
		if(pig[x].card[i]=='K'){
			if(useK&&pig[x].zgln==0) continue;
			if(pig[pig[x].beside].brightstatus!=0){
				if(pig[pig[x].beside].brightstatus==1||pig[pig[x].beside].brightstatus==2){
					if(pig[x].status==3){
						pig[x].card.erase(i,1);
						pig[x].cardcnt--;
						i--;
						sha(x,pig[x].beside);
						useK=1;
					}
				}
				if(pig[pig[x].beside].brightstatus==3){
					if(pig[x].status==1||pig[x].status==2){
						pig[x].card.erase(i,1);pig[x].cardcnt--;
						i--;
						sha(x,pig[x].beside);
						useK=1;
					}
				}
			}
			if(pig[x].status==1&&leifan[pig[x].beside]){
				pig[x].card.erase(i,1);pig[x].cardcnt--;
				i--;
				sha(x,pig[x].beside);
			}
			continue;
		}
		if(pig[x].card[i]=='P'&&pig[x].blood<4){
			peach(x);pig[x].card.erase(i,1);pig[x].cardcnt--;
			i--;
			continue;
		}
		if(pig[x].card[i]=='F'){
			int j=x;//这里第一遍写成i了:( 
			for(int cnt=1;cnt<n;cnt++){
				j++;
				if(pig[j].dead) continue;
				if(j>n) j=1;
				if(pig[x].status==1){
					if(pig[j].brightstatus==3||leifan[j]){
						pig[x].card.erase(i,1);pig[x].cardcnt--;
						juedou(x,j);
						if(pig[x].dead) return;
						cnt=n+1;
						i--;
					}
				}
				if(pig[x].status==2){
					if(pig[j].brightstatus==3){
						pig[x].card.erase(i,1);pig[x].cardcnt--;
						juedou(x,j);
						if(pig[x].dead) return;
						cnt=n+1;
						i--;
					}
				}
				if(pig[x].status==3){
					pig[x].card.erase(i,1);pig[x].cardcnt--;
					juedou(x,1);
					if(pig[x].dead) return;
					cnt=n+1;
					i--;
				}
			}
			continue;
		}
		if(pig[x].card[i]=='N'){
			pig[x].card.erase(i,1);
			pig[x].cardcnt--;
			nanwan(x,0);
			i--;
			continue;
		}
		if(pig[x].card[i]=='W'){
			pig[x].card.erase(i,1);pig[x].cardcnt--;
			nanwan(x,1);
			i--;
			continue;
		}
		if(pig[x].card[i]=='Z'){
			pig[x].card.erase(i,1);pig[x].cardcnt--;
			pig[x].zgln=1;
			i=1;
			//诸葛连弩后重新搜一遍有没有杀
		}
		if(gameend) return;
	}
//	for(int i=1;i<=pig[x].cardcnt;i++) cout<<pig[x].card[i]<<' ';
//	cout<<endl;
//	cout<<x<<' '<<"have "<<pig[x].blood<<" blood"<<endl;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		pig[i].card+='0';//填一个 
		string s;
		cin>>s;//身份 
		if(s=="MP") pig[i].status=1;
		if(s=="ZP") pig[i].status=2;
		if(s=="FP") pig[i].status=3,f++;
		string s1;
		getline(cin,s1);
		pig[i].card+=s1[1];
		pig[i].card+=s1[3];
		pig[i].card+=s1[5];
		pig[i].card+=s1[7];
		//手牌
		pig[i].cardcnt=4;
		pig[i].blood=4;
		if(i==n){
			pig[i].beside=1;
		}
		else{
			pig[i].beside=i+1;
		}//旁边的猪 
	}//输入初始信息 
	pig[1].brightstatus=1;
	for(int i=1;i<=m;i++){
		char c;
		cin>>c;
		cardq.push(c);
		if(i==m) lastcard=c;
	}//牌堆 
	while(!gameend){
		now++;
		if(now>n){
			now=1;
		}
		if(pig[now].dead==0) huihe(now);
		//注意只有活猪才能出牌 
	}
}

//杀 K
//闪 D
//桃 P
//决斗 F
//南蛮 N
//万箭 W
//无懈 J
//诸葛连弩 Z

2025/8/31 19:44
加载中...