40分求助
查看原帖
40分求助
537627
_LSA_楼主2022/6/8 22:34
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const int MAXPLAYER = 15;
const int MAXCARD = 2100;
int n;                                               //玩家数 
struct Player{
	int s,nxt,lst;                                   //体力
	string id;                                       //MP主猪,ZP忠猪,FP反猪
	int cl;                                          //手牌数 
	char c[MAXCARD];                                 //P桃,K杀,D闪,F决斗,N南猪入侵,W万箭齐发,J无懈可击
	bool f;                                          //1表示装备诸哥连弩,0反之 
	bool dead;                                       //0表示活着,1死亡 
}player[MAXPLAYER];
bool ed = false;
int m,cl = 1;                                        //牌堆中牌数,现在摸到的牌数 
char card[MAXCARD];                                  //牌堆中牌
string sf[MAXPLAYER];                                //主猪眼中身份 
int fz;                                              //反贼数 
void mp(int x){                                      //摸牌 
	if(cl > m) player[x].c[++player[x].cl] = card[m];
	else player[x].c[++player[x].cl] = card[cl];	
	cl++;
}
void js(int x,int y){                                 //判断击杀 
	for(int i=1;i<=player[y].cl;i++)
		if(player[y].c[i] == 'P'){
			player[y].c[i] = 'U';
			player[y].s++;
			return;
		}
	player[y].dead = 1;
	player[player[y].lst].nxt = player[y].nxt;
	player[player[y].nxt].lst = player[y].lst;
	if(y == 1){ed = true; return;}
	if(player[y].id == "FP") fz--;
	if(!fz){ed = true;return;}
	if(player[y].id == "FP"){mp(x);mp(x);mp(x);}
	if(player[x].id == "MP" && player[y].id == "ZP") player[x].cl = 0,player[x].f = false;
}
void kil(int x,int y){                                //杀 
	for(int i=1;i<=player[y].cl;i++)
		if(player[y].c[i] == 'D'){
			player[y].c[i] = 'U';
			return;
		}
	player[y].s--;
	if(!player[y].s) js(x,y);
}
bool wxkj(int x,int y,bool z){                         //无懈可击  z:0表示抵无懈可击 
	int i = x;
	while(true){
		if(z){
			if(player[i].id == sf[y] || (player[i].id == "MP" && sf[y] == "ZP") || (player[i].id == "ZP" && sf[y] == "MP"))
			//队友献殷勤 
				for(int j=1;j<=player[i].cl;j++)
					if(player[i].c[j] == 'J'){
						player[i].c[j] = 'U';
						sf[i] = player[i].id;
						return !wxkj(i,x,0);
					}
		}
		else{
			if((player[i].id == "FP" && (sf[x] == "MP" || sf[x] == "ZP")) || (sf[x] == "FP" && (player[i].id == "MP" || player[i].id == "ZP"))){
			//敌人表敌意
				 for(int j=1;j<=player[i].cl;j++)
					if(player[i].c[j] == 'J'){
						player[i].c[j] = 'U';
						sf[i] = player[i].id;
						return !wxkj(i,x,0);
					}
			}
		}
		i = player[i].nxt;
		if(i == x) break;
	}
	return false; 
}
void nzrq(int x){                                     //南猪入侵 
	for(int i=player[x].nxt;i!=x;i=player[i].nxt){
		if(wxkj(x,i,1)) continue;
		int j;
		for(j=1;j<=player[i].cl;j++){
			if(player[i].c[j] == 'K'){
				player[i].c[j] = 'U';
				break;
			}
		}
		if(j > player[i].cl){
			player[i].s--;
			if(!player[i].s) js(x,i);
			if(i == 1 && sf[x] == "U") sf[x] = "LFP";
			if(ed) return;
		}
	}
}
void wjqf(int x){                                     //万箭齐发 
	for(int i=player[x].nxt;i!=x;i=player[i].nxt){
		if(wxkj(x,i,1)) continue;
		int j;
		for(j=1;j<=player[i].cl;j++){
			if(player[i].c[j] == 'D'){
				player[i].c[j] = 'U';
				break;
			}
		}
		if(j > player[i].cl){
			player[i].s--;
			if(i == 1 && sf[x] == "U") sf[x] = "LFP";
			if(!player[i].s) js(x,i);
			if(ed) return;
		}
	}
}
void jd(int x,int y){                                 //决斗 
	if(wxkj(x,y,1)) return;
	if(x == 1 && player[y].id == "ZP"){
		player[y].s--;
		if(!player[y].s) js(x,y);
		return;
	}
	int j,k;
	j = k = 1;
	while(true){//此处有错,不知何改
		while(player[y].c[j] != 'K' && j<=player[y].cl) j++;
		if(j > player[y].cl){
			player[y].s--;
			if(!player[y].s) js(x,y);
			return;
		}
		else player[y].c[j] = 'U';
		while(player[x].c[k] != 'K' && k<=player[x].cl) k++;
		if(k > player[x].cl){
			player[x].s--;
			if(!player[x].s) js(y,x);
			return;
		}
		else player[x].c[k] = 'U';
	}
}
int main(){
	ios::sync_with_stdio(false);
	freopen("P2482_6.in","r",stdin);
	cin >> n >> m;
	for(int i=1;i<=n;i++){
		cin >> player[i].id;
		for(int j=1;j<=4;j++) cin >> player[i].c[j];
		if(player[i].id == "FP") fz++;
		player[i].s = player[i].cl = 4;
		player[i].f = false;
		player[i].dead = false;
		player[i].nxt = i+1; player[i].lst = i-1;
	}
	player[1].lst = n; player[n].nxt = 1;
	for(int i=1;i<=m;i++) cin >> card[i];
	sf[1] = "MP"; for(int i=2;i<=n;i++) sf[i] = "U";
	for(int i=1;i;i=player[i].nxt){
		if(ed) break;
		if(player[i].dead) continue;
		mp(i); mp(i);
		for(int j=1;j<=player[i].cl;j++){
			bool kill = true;//判断是否使用过杀 
			if(ed) break;
			char cn = player[i].c[j];
			if(cn == 'U') continue;
			if(cn == 'P'){
				if(player[i].s == 4) continue;
				player[i].s++;
				player[i].c[j] = 'U';
			}
			else if(cn == 'K'){
				if(!kill && !player[i].f) continue;
				if(player[i].id == "MP" && sf[player[i].nxt] != "FP" && sf[player[i].nxt] != "LFP") continue;
				if(player[i].id == "ZP" && sf[player[i].nxt] != "FP") continue;
				if(player[i].id == "FP" && sf[player[i].nxt] != "MP" && sf[player[i].nxt] != "ZP") continue;
				sf[i] = player[i].id;
				kil(i,player[i].nxt);
				player[i].c[j] = 'U';
				kill = false;
				if(ed) break;
				continue;
			}
			else if(cn == 'Z'){
				player[i].f = true;
				player[i].c[j] = 'U';
				j = 0;
				continue;
			}
			else if(cn == 'F'){
				if(player[i].id == "FP"){
					//cout << i << " " << 1 << "\n";
					jd(i,1);
					sf[i] = player[i].id;
					player[i].c[j] = 'U';
					if(ed) break;
					j=0;
					continue;
				}
				for(int k=player[i].nxt;k!=i;k=player[k].nxt){
					if(i == 1 && (sf[k] == "FP" || sf[k] == "LFP") || player[i].id == "ZP" && sf[k] == "FP"){
						//cout << i << " " << k << "\n";
						jd(i,k);
						player[i].c[j] = 'U';
						sf[i] = player[i].id;
						if(ed) break;
						j=0;
						continue;
					}
				}
			}
			else if(cn == 'W'){
				wjqf(i);
				player[i].c[j] = 'U';
				if(ed) break;
				j=0;
				continue;
			}
			else if(cn == 'N'){
				nzrq(i);
				player[i].c[j] = 'U';
				if(ed) break;
				j=0;
				continue;
			}
			if(ed) break;
		}
	}
	
	if(player[1].dead) cout << "FP\n";
	else cout << "MP\n";
	for(int i=1;i<=n;i++){
		if(player[i].dead) cout << "DEAD\n";
		else{
			for(int j=1;j<=player[i].cl;j++)
				if(player[i].c[j] != 'U' && player[i].c[j] != ' ')
					cout << player[i].c[j] << " ";
			cout <<"\n";
		}
	} 
	return 0;
}

似乎是决斗那边死循环了
但我对照大佬的代码好像没错

2022/6/8 22:34
加载中...