WA+RE求助,玄10rmb(支持微信)
查看原帖
WA+RE求助,玄10rmb(支持微信)
1287433
__ycy1124__楼主2024/10/8 15:06
#include<bits/stdc++.h>
using namespace std;
stack<int>deck;//牌堆 
int bottom;//堆底 
int fn=0;
int n,m;
struct Node{//角色 
	int role,hp,p[8],faction=0,w[5];//身份,血,卡,派别,前面用的卡这次要轮掉。(身份:主,忠,反) (派别:0未知,1跳反,2类反,3跳忠)
	queue<int>card;//卡 
	bool survive,ln;//是否死亡,是否武器 
}a[11];
int conversion(char ch){//转换 
	if(ch=='P')//tao
		return 1;
	else if(ch=='K')//sha
		return 2;
	else if(ch=='D')//shan
		return 3;
	else if(ch=='F')//juedou
		return 4;
	else if(ch=='N')//nanman
		return 5;
	else if(ch=='W')//wanjian
		return 6;
	else if(ch=='J')//wuxiekeji
		return 7;
	else//zhugeliannv
		return 8;
}
void End(){
	if(fn==0){//反猪死光了 
		puts("MP");
	}
	else{
		puts("FP");
	}
	for(int i=1;i<=n;i++){// 
		if(!a[i].survive){//死亡猪 
			puts("DEAD");
			continue;
		}
		else{
			while(!a[i].card.empty()){//输出手牌 
				if(a[i].card.front()==1){
					printf("P ");
				}
				else if(a[i].card.front()==2){
					printf("K ");
				}
				else if(a[i].card.front()==3){
					printf("D ");
				}
				else if(a[i].card.front()==4){
					printf("F ");
				}
				else if(a[i].card.front()==5){
					printf("N ");
				}
				else if(a[i].card.front()==6){
					printf("W ");
				}
				else if(a[i].card.front()==7){
					printf("J ");
				}
				else{
					printf("Z ");
				}
				a[i].card.pop();
			}
			puts("");
		}
	}
	return;
}
bool pd(int p){
	int j=p+1;//枚举 
	for(;j!=p;j++){// 
		if(j>n){
			j-=n;
			if(j==p){
				break;
			}
		}
		if(!a[j].survive){//死了 
			continue;
		}
		if(a[p].faction==2&&(a[j].role==1||a[j].role==2)){//反猪出的牌,主猪和忠猪出无懈可击 
			if(a[j].p[7]){
				if(a[j].role==2)//跳忠 
					a[j].faction=3; 
				a[j].p[7]--;
				a[j].w[5]++;
				return !pd(j);//取反 
			}
		}
		else if((a[p].faction==3||a[p].role==1)&&a[j].role==3){//反猪对 
			if(a[j].p[7]){
				a[j].faction=2;
				a[j].p[7]--;
				a[j].w[5]++;
				return !pd(j);
			}
		}
	}
	return 0;
}
int number;
int main(){
	scanf("%d%d",&n,&m);
	int tmp=0;
	number=n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		a[i].survive=1;
		if(s=="MP")
			a[i].role=1;
		else if(s=="ZP")
			a[i].role=2;
		else{
			a[i].role=3;
			fn++;
		}
		char ch;
		for(int j=1;j<=4;j++){
			cin>>ch;
			a[i].faction=0;
			++a[i].p[conversion(ch)];
			a[i].card.push(conversion(ch));
			if(conversion(ch)==8){
				a[i].ln=1;
			}
		}
		a[i].hp=4;
	}
	for(int i=1;i<=m;i++){
		char ch;
		cin>>ch;
		deck.push(conversion(ch));
		bottom=conversion(ch);
	}
	queue<int>w;
	while(!deck.empty()){
		w.push(deck.top());
		deck.pop();
	}
	while(!w.empty()){
		deck.push(w.front());
		w.pop();
	}
	if(fn==0){
		End();
		return 0;
	}
	while(number>1){
		++tmp;//轮下一个
		if(tmp>n)
			tmp-=n;
		if(!a[tmp].survive)
			continue;
		if(!deck.empty()){//摸牌 
			a[tmp].card.push(deck.top());
			a[tmp].p[deck.top()]++;
			if(deck.top()==8)
				a[tmp].ln=1;
			deck.pop();
		}
		else{
			a[tmp].card.push(bottom);
			a[tmp].p[bottom]++;
			if(bottom==8)
				a[tmp].ln=1;
		}
		if(!deck.empty()){
			a[tmp].card.push(deck.top());
			a[tmp].p[deck.top()]++;
			if(deck.top()==8)
				a[tmp].ln=1;
			deck.pop();
		}
		else{
			a[tmp].card.push(bottom);
			a[tmp].p[bottom]++;
			if(bottom==8)
				a[tmp].ln=1;
		}
		while(!w.empty()){
			a[tmp].card.push(w.front());
			w.pop();
		}
		bool bj=0;//是否用过杀 
		if(!a[tmp].survive)//死亡就跳 
			continue;
		queue<int>q;//存牌 
		while(!a[tmp].card.empty()){//出牌 
			if(a[tmp].card.front()==1){//桃 
				if(a[tmp].w[1]>=1){//原来用过现在出队 
					a[tmp].w[1]--;
					a[tmp].card.pop();
					continue;
				}
				else if(a[tmp].hp<4){//没满就吃 
					a[tmp].hp++;
					a[tmp].card.pop();
					continue;
				}
				q.push(a[tmp].card.front());//没有用就继续拿着 
				a[tmp].card.pop();
				continue;
			}
			else if(a[tmp].card.front()==2){//杀 
				if(a[tmp].w[2]>=1){//原来用过就出队 
					a[tmp].w[2]--;
					a[tmp].card.pop();
					continue;
				}
				if(bj==1&&!a[tmp].ln){//已经出过杀了且没有诸葛连弩 
					q.push(a[tmp].card.front());
					a[tmp].card.pop();
					continue;
				}
				int j=tmp+1;//下一个,距离为一的 
				for(;!a[j].survive;j++){if(j>n){j-=n;if(j==tmp) break;}if(a[j].survive==1)break;}
				if(a[tmp].role==1&&(a[j].faction==1||a[j].faction==2)){//主猪对跳反和类反的猪出杀 
					if(a[j].p[3]>=1){//对方有闪 
						a[j].p[3]--;
						a[j].w[3]++;
						a[tmp].card.pop();
						bj=1;
						continue;
					}
					else{//无闪 
						a[tmp].card.pop();
						a[j].hp--;//扣血 
						bj=1;
						if(a[j].hp==0){//血为0 
							if(a[j].p[1]>=1){//有桃 
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp=1;
								continue; 
							}
							else{
								a[j].survive=0;//死亡 
								number--;
								if(a[j].role==2){//杀死忠猪 
									while(!a[tmp].card.empty())//弃牌 
										a[tmp].card.pop();
									while(!q.empty())
										q.pop();
									a[tmp].ln=0;
									for(int i=1;i<=7;i++)
										a[tmp].p[i]=0;
									for(int i=1;i<=4;i++)
										a[tmp].w[i]=0;
									continue;
								}
								else if(a[j].role==3){//杀死反猪 
									fn--;//反猪数量-- 
									if(fn==0){//没有反猪了,game over 
										while(!a[tmp].card.empty()){
											q.push(a[tmp].card.front());
											q.pop();
										}
										while(!q.empty()){
											a[tmp].card.push(q.front());
											q.pop();
										}
										End();
										return 0;
									}
									for(int i=1;i<=3;i++){//摸3张牌 
										if(!deck.empty()){
											a[tmp].card.push(deck.top());
											a[tmp].p[deck.top()]++;
											if(deck.top()==8)
												a[tmp].ln=1;
											deck.pop();
										}
										else{
											a[tmp].card.push(bottom);
											a[tmp].p[bottom]++;
											if(bottom==8)
												a[tmp].ln=1;
										}
									}
									number--;
									continue;
								}
							}
						}
					}
				}
				else if(a[tmp].role==2&&(a[j].faction==1)){//忠猪对已经跳反的出杀
					bj=1;
					a[tmp].faction=3;//跳忠 
					if(a[j].p[3]>=1){//有闪 
						a[j].p[3]--;
						a[j].w[3]++;
						a[tmp].card.pop();
						continue;
					}
					else{
						number--;
						a[j].hp--;//否则扣血 
						if(a[j].hp==0){//死了 
							if(a[j].p[1]>=1){//用桃 
								a[j].p[1]--;
								a[j].hp++;
								a[j].w[1]++;
								a[tmp].card.pop();
								continue;
							}
							else{
								a[j].survive=0;//死了 
								a[tmp].card.pop();
								fn--;
								number--;
								if(fn==0){//反猪死光了
									while(!a[tmp].card.empty()){
										q.push(a[tmp].card.front());
										q.pop();
									}
									while(!q.empty()){
										a[tmp].card.push(q.front());
										q.pop();
									} 
									End();
									return 0;
								}
								for(int i=1;i<=3;i++){//反猪死了摸牌 
									if(!deck.empty()){
										a[tmp].card.push(deck.top());
										a[tmp].p[deck.top()]++;
										if(deck.top()==8)
											a[tmp].ln=1;
										deck.pop();
									}
									else{
										a[tmp].card.push(bottom);
										a[tmp].p[bottom]++;
										if(bottom==8)
											a[tmp].ln=1;
									}
								}
								continue;
							}
						}
					}
				}
				else if(a[tmp].role==3&&(a[j].role==1||a[j].faction==3)){//反猪出杀 
					bj=1;
					a[tmp].faction=2;//跳反 
					if(a[j].p[3]>=1){//有闪 
						a[j].p[3]--;
						a[j].w[3]++;
						a[tmp].card.pop();
						continue;
					}
					else{
						a[j].hp--;//扣血 
						if(a[j].hp==0){//0血 
							if(a[j].p[1]>=1){//有桃 
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp++;
								a[tmp].card.pop();
								continue;
							}
							else{//无闪 
								a[j].survive=0;//死了 
								a[tmp].card.pop();
								number--;
								if(a[j].role==1){//主公死了 
									while(!a[tmp].card.empty()){
										q.push(a[tmp].card.front());
										a[tmp].card.pop();
									}
									while(!q.empty()){
										a[tmp].card.push(q.front());
										q.pop();
									} 
									End();
									return 0;
								}
								continue;
							}
						} 
					}
				}
				q.push(a[tmp].card.front());
				a[tmp].card.pop();
				continue;
			}
			else if(a[tmp].card.front()==3){//闪 
				if(a[tmp].w[3]>=1){//用掉的 
					a[tmp].w[3]--;
					a[tmp].card.pop();
					continue;
				}
				else{
					q.push(a[tmp].card.front());
					a[tmp].card.pop();
					continue;
				}
			}
			else if(a[tmp].card.front()==4){//决斗 
				if(a[tmp].role==1){//主公出决斗 
					int j=tmp+1;
					for(;j!=tmp;j++){//寻找出牌目标 
						if(j>n){
							j-=n;
							if(j==tmp)
								break;
						}
						if(a[j].survive&&(a[j].faction==1||a[j].faction==2))
							break;
					}
					if(j==tmp){//没找到 
						q.push(a[tmp].card.front());
						a[tmp].card.pop();
						continue;
					}
					a[tmp].card.pop();
					if(a[j].role!=2)
						if(pd(tmp)){
							continue;
						}
					if(a[j].role==2){
						a[j].hp--;
						if(a[j].hp==0){
							if(a[j].p[1]>=1){
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp++;
								continue;
							}
							else{
								a[j].survive=0;
								number--;
								while(!a[tmp].card.empty()){
									a[tmp].card.pop();
								}
								while(!q.empty()){
									q.pop();
								}
								for(int i=1;i<=7;i++){
									a[tmp].p[i]=0;
								}
								for(int i=1;i<=4;i++){
									a[tmp].w[i]=0;
								}
								a[tmp].ln=0;
								continue;
							}
						}
						continue;
					}
					if(a[tmp].p[2]>=a[j].p[2]){//自己杀多 
						--a[j].hp;
						a[tmp].p[2]-=a[j].p[2];
						a[tmp].w[2]+=a[j].p[2];
						a[j].w[2]+=a[j].p[2];
						a[j].p[2]=0;
						if(a[j].hp==0){
							if(a[j].p[1]>=1){
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp++;
								continue;
							}
								else if(a[j].role==3){
									fn--;
									number--;
									if(fn==0){
										while(!a[tmp].card.empty()){
											q.push(a[tmp].card.front());
											a[tmp].card.pop();
										}
										while(!q.empty()){
											a[tmp].card.push(q.front());
											q.pop();
										} 
										End();
										return 0;
									}
									for(int i=1;i<=3;i++){//反猪死了摸牌 
										if(!deck.empty()){
											a[tmp].card.push(deck.top());
											a[tmp].p[deck.top()]++;
											if(deck.top()==8)
												a[tmp].ln=1;
											deck.pop();
										}
										else{
											a[tmp].card.push(bottom);
											a[tmp].p[bottom]++;
											if(bottom==8)
												a[tmp].ln=1;
										}
									}
									continue;
								}
							}
						}
					else{
						--a[tmp].hp;
						a[j].p[2]-=a[tmp].p[2];
						a[j].p[2]--;
						a[j].w[2]+=a[tmp].p[2];
						a[j].w[2]++;
						a[tmp].w[2]+=a[tmp].p[2];
						a[tmp].p[2]=0;
						if(a[tmp].hp==0){
							if(a[tmp].p[1]>=1){
								a[tmp].hp++;
								a[tmp].p[1]--;
								a[tmp].w[1]++;
								continue;
							}
							else{
								number--;
								a[tmp].survive=0;
								while(!a[tmp].card.empty()){
									q.push(a[tmp].card.front());
									a[tmp].card.pop();
								}
								while(!q.empty()){
									a[tmp].card.push(q.front());
									q.pop();
								} 
								End();
								return 0;
							}
						}
					}
				}
				else if(a[tmp].role==2){
					a[tmp].faction=3;
					int j=tmp+1;
					for(;j!=tmp;j++){
						if(j>n){
							j-=n;
							if(j==tmp)
								break;
						}
						if(!a[j].survive)
							continue;
						if(a[j].faction==2)
							break;
					}
					if(j==tmp){
						q.push(a[tmp].card.front());
						a[tmp].card.pop();
						continue;
					}
					a[tmp].card.pop();
					if(pd(tmp))
						continue;
					if(a[tmp].p[2]>=a[j].p[2]){
						a[tmp].p[2]-=a[j].p[2];
						a[tmp].w[2]+=a[j].p[2];
						a[j].w[2]+=a[j].p[2];
						a[j].p[2]=0;
						a[j].hp--;
						if(a[j].hp==0){
							if(a[j].p[1]>=1){
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp++;
								continue;
							}
							else{
								a[j].survive=0;
								fn--;
								number--;
								if(fn==0){
									while(!a[tmp].card.empty()){
										q.push(a[tmp].card.front());
										a[tmp].card.pop();
									}
									while(!q.empty()){
										a[tmp].card.push(q.front());
										q.pop();
									} 
									End();
									return 0;
								}
								for(int i=1;i<=3;i++){//反猪死了摸牌 
									if(!deck.empty()){
										a[tmp].card.push(deck.top());
										a[tmp].p[deck.top()]++;
										if(deck.top()==8)
											a[tmp].ln=1;
										deck.pop();
									}
									else{
										a[tmp].card.push(bottom);
										a[tmp].p[bottom]++;
										if(bottom==8)
											a[tmp].ln=1;
									}
								}
								continue;
							}
						}
					}
						else{
							a[j].p[2]-=a[tmp].p[2];
							a[j].p[2]--;
							a[j].w[2]+=a[tmp].p[2];
							a[j].w[2]++;
							a[tmp].w[2]+=a[tmp].p[2];
							a[tmp].p[2]=0;
							a[tmp].hp--;
							if(a[tmp].hp==0){
								if(a[tmp].p[1]>=1){
									a[tmp].p[1]--;
									a[tmp].w[1]++;
									a[tmp].hp++;
									continue;
								}
								else{
									number--;
									a[tmp].survive=0;
									continue;
								}
							}
						}
					}
					else{
						a[tmp].faction=2;
						a[tmp].card.pop();
						if(pd(tmp))
							continue;
						if(a[tmp].p[2]>=a[1].p[2]){
							a[tmp].p[2]-=a[1].p[2];
							a[tmp].w[2]+=a[1].p[2];
							a[1].w[2]+=a[1].p[2];
							a[1].p[2]=0;
							a[1].hp--;
							if(a[1].hp==0){
								if(a[1].p[1]>=1){
									a[1].p[1]--;
									a[1].w[1]++;
									a[1].hp++;
									continue;
								}
								else{
									a[1].survive=0;
									while(!a[tmp].card.empty()){
										q.push(a[tmp].card.front());
										a[tmp].card.pop();
									}
									while(!q.empty()){
										a[tmp].card.push(q.front());
										q.pop();
									} 
									End();
									return 0;
								}
							}
						}
						else{
							a[1].p[2]-=a[tmp].p[2];
							a[1].p[2]--;
							a[1].w[2]+=a[tmp].p[2];
							a[1].w[2]++;
							a[tmp].w[2]+=a[tmp].p[2];
							a[tmp].p[2]=0;
							a[tmp].hp--;
							if(a[tmp].hp==0){
								if(a[tmp].p[1]>=1){
									a[tmp].p[1]--;
									a[tmp].w[1]++;
									a[tmp].hp++;
									continue;
								}
								else{
									a[tmp].survive=0;
									fn--;
									if(fn==0){
										while(!a[tmp].card.empty()){
											q.push(a[tmp].card.front());
											a[tmp].card.pop();
										}
										while(!q.empty()){
											a[tmp].card.push(q.front());
											q.pop();
										} 
										End;
										return 0;
									}
									for(int i=1;i<=3;i++){//反猪死了摸牌 
										if(!deck.empty()){
											a[tmp].card.push(deck.top());
											a[tmp].p[deck.top()]++;
											if(deck.top()==8)
												a[tmp].ln=1;
											deck.pop();
										}
										else{
											a[tmp].card.push(bottom);
											a[tmp].p[bottom]++;
											if(bottom==8)
												a[tmp].ln=1;
										}
									}
									continue;
								}
							}
						}
					}
				}
				else if(a[tmp].card.front()==5){
					int j=tmp+1;
					a[tmp].card.pop();
					for(;j!=tmp;j++){
						if(j>n){
							j-=n;
							if(j==tmp){
								continue;
							}
						}
						if(a[j].survive==0){
							continue;
						}
						if(pd(tmp)){
							continue;
						}
						if(a[j].p[2]>=1){
							a[j].p[2]--;
							a[j].w[2]++;
							continue;
						}
						else{
							a[j].hp--;
							if(a[j].role==1&&!a[tmp].faction){
								a[tmp].faction=1;
							}
							if(a[j].hp==0){
								if(a[j].p[1]>=1){
									a[j].p[1]--;
									a[j].w[1]++;
									a[j].hp++;
									continue;
								}
								else{
									if(a[j].role==1){
										a[j].survive=0;
										number--;
										while(!a[tmp].card.empty()){
											q.push(a[tmp].card.front());
											a[tmp].card.pop();
										}
										while(!q.empty()){
											a[tmp].card.push(q.front());
											q.pop();
										} 
										End();
										return 0;
									}
									if(a[j].role==3){
										a[j].survive=0;
										number--;
										fn--;
										if(fn==0){
											while(!a[tmp].card.empty()){
												q.push(a[tmp].card.front());
												a[tmp].card.pop();
											}
											while(!q.empty()){
												a[tmp].card.push(q.front());
												q.pop();
											} 
											End();
											return 0;
										}
										for(int i=1;i<=3;i++){//反猪死了摸牌 
											if(!deck.empty()){
												a[tmp].card.push(deck.top());
												a[tmp].p[deck.top()]++;
												if(deck.top()==8)
													a[tmp].ln=1;
												deck.pop();
											}
											else{
												a[tmp].card.push(bottom);
												a[tmp].p[bottom]++;
												if(bottom==8)
													a[tmp].ln=1;
											}
										}
										continue;
									}
									if(a[j].role==2&&tmp==1){
										a[j].survive=0;
										number--;
										while(!a[tmp].card.empty()){
											a[tmp].card.pop();
										}
										while(!q.empty()){
											q.pop();
										}
										for(int i=1;i<=7;i++){
											a[tmp].p[i]=0;
										}
										for(int i=1;i<=4;i++){
											a[tmp].w[i]=0;
										}
										continue;
									}
									number--;
									continue;
								}
							}
						}
					}
				}
			else if(a[tmp].card.front()==6){
				int j=tmp+1;
				a[tmp].card.pop();
				for(;j!=tmp;j++){
					if(j>n){
						j-=n;
						if(j==tmp){
							continue;
						}
					}
					if(pd(tmp)){
						continue;
					}
					if(a[j].p[3]>=1){
						a[j].p[3]--;
						a[j].w[3]++;
						continue;
					}	
					else{
						a[j].hp--;
						if(a[j].hp==0){
							if(a[j].p[1]>=1){
								a[j].p[1]--;
								a[j].w[1]++;
								a[j].hp++;
								continue;
							}
							else{
								if(a[j].role==1){
									a[j].survive=0;
									number--;
									while(!a[tmp].card.empty()){
										q.push(a[tmp].card.front());
										a[tmp].card.pop();
									}
									while(!q.empty()){
										a[tmp].card.push(q.front());
										q.pop();
									} 
									End();
									return 0;
								}
								if(a[j].role==3){
									a[j].survive=0;
									number--;
									fn--;
									if(fn==0){
										while(!a[tmp].card.empty()){
											q.push(a[tmp].card.front());
											a[tmp].card.pop();
										}
										while(!q.empty()){
											a[tmp].card.push(q.front());
											q.pop();
										} 
										End();
										return 0;
									}
									for(int i=1;i<=3;i++){//反猪死了摸牌 
										if(!deck.empty()){
											a[tmp].card.push(deck.top());
											a[tmp].p[deck.top()]++;
											if(deck.top()==8)
												a[tmp].ln=1;
											deck.pop();
										}
										else{
											a[tmp].card.push(bottom);
											a[tmp].p[bottom]++;
											if(bottom==8)
												a[tmp].ln=1;
										}
									}
									continue;
								}
								if(a[j].role==2&&tmp==1){
									a[j].survive=0;
									number--;
									while(!a[tmp].card.empty()){
										a[tmp].card.pop();
									}
									while(!q.empty()){
										q.pop();
									}
									for(int i=1;i<=7;i++){
										a[tmp].p[i]=0;
									}
									for(int i=1;i<=4;i++){
										a[tmp].w[i]=0;
									}
									continue;
								}
								number--;
								continue;
							}
						}
					}
				}
			}
			else if(a[tmp].card.front()==7){
				if(a[tmp].w[4]){
					a[tmp].w[4]--;
					a[tmp].card.pop();
					continue;
				}
				q.push(a[tmp].card.front());
				a[tmp].card.pop();
				continue;
			}
			else{
				q.push(a[tmp].card.front());
				a[tmp].card.pop();
				continue;
			}
		}
		while(!q.empty()){
			a[tmp].card.push(q.front());
			q.pop();
		}
	}
	End();
	return 0;
}
2024/10/8 15:06
加载中...