玄关,求调,65分,真的想不出来了
查看原帖
玄关,求调,65分,真的想不出来了
902912
Yang_Ziyue楼主2024/8/20 17:10

WA:#4 #5

TLE:#8 #13 #14 #16 #23

程序变量全是拼音(一看就懂)

做了3天了,救救孩子吧。

有过程版:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <map>
#include <set>
#include <cstdlib>
#include <utility>
#include <deque>
#include <unordered_map>
using namespace std;
#define hfmx 0x3f3f3f3f / 2
#define ts cout << "tt" << endl;
#define sf(x) for(register int i = 1 ; i <= x ; i++)
#define reg register
#define fi first
#define se second
#define mmx(x) memset(x, 0x3f, sizeof x)
#define mmn(x) memset(x, -0x3f, sizeof x)
#define fu1(x) memset(x, -1, sizeof x)
#define zr(x) memset(x, 0, sizeof x)
#define el << endl
#define bl << ' ' <<
#define pii pair<int, int>
struct PAI{
	int type;
	bool vis;
};
struct ZHU{ // 猪 
	int shenfen; // 1主 2忠 3反 
	int shengming = 4; // 生命值 
	bool sihuo = 1; // 是死是活 
	bool tiaolema = 0; // 是否表明身份  
	bool youwuliannu = 0;
	int nuid = 0;
	vector<PAI> shoupai; // 1桃 2杀 3闪 4决斗 5南猪入侵 6万箭齐发 7无懈可击
};
int zhu; // 猪的数量 
int pai; // 牌堆的数量 
int zhuzhu; // 开始的猪 
string tmpa;
char tmpb, tmpc, tmpd, tmpe;
queue<int> paidui; // 牌堆 
ZHU Zhu[20]; // 每只猪 
int youzhu[20]; // 右猪, 逆时针 
int zuozhu[20]; // 左猪, 顺时针
int taidu[20]; // 是否类反 
bool jieshu;
map<char, int> zheng = {{'P', 1}, {'K', 2}, {'D', 3}, {'F', 4}, {'N', 5}, {'W', 6}, {'J', 7}, {'Z', 8}};
map<int, char> fan = {{1, 'P'}, {2, 'K'}, {3, 'D'}, {4, 'F'}, {5, 'N'}, {6, 'W'}, {7, 'J'}, {8, 'Z'}};
// 双方输赢 ok 
bool zhuzhuyinglema() {
	if (Zhu[zhuzhu].sihuo == 0) return 0;
	for (int i = 1 ; i <= zhu ; i++) {
		if (Zhu[i].shenfen == 3 && Zhu[i].sihuo == 1) {
			return 0;
		}
	}
	return 1;
}
void shuchu() {
	if (zhuzhuyinglema()) cout << "MP\n";
	else if (Zhu[zhuzhu].sihuo == 0) cout << "FP\n";
	else return ;
	for (int i = 1 ; i <= zhu ; i++) {
		if (Zhu[i].sihuo == 0) cout << "DEAD";
		else {
			for (PAI j : Zhu[i].shoupai) {
				if (j.vis) continue;
				cout << fan[j.type] << ' ';
			}
		}
		cout << endl;
	}
	exit(0);
}
bool silema(int z) { // 死没死?及死后处理 
	if (Zhu[z].shengming == 0) {
		for (int i = 0 ; i < Zhu[z].shoupai.size() ; i++){
			if (Zhu[z].shoupai[i].vis) continue;
			if (Zhu[z].shoupai[i].type == 1) {
				Zhu[z].shoupai[i].vis = 1;
				Zhu[z].shengming++;
				cout << z << "濒死桃" el; 
				return 0;
			}
		}
		cout << z << "死了" el; 
		youzhu[zuozhu[z]] = youzhu[z];
		zuozhu[youzhu[z]] = zuozhu[z];
		Zhu[z].sihuo = 0;
		shuchu(); 
		return 1;
	}
	return 0;
}
// 摸牌 ok 
void mopai(int z, int c) {
	while (c--) {
		int xinpai = paidui.front();
		//cout << z << "摸到" << xinpai el;
		Zhu[z].shoupai.push_back({xinpai, 0});
		if (paidui.size() > 1) paidui.pop();
	}
}

void shanghaipanding(int z1, int z2) { // 造成伤害后的判定 
	Zhu[z2].shengming--;
	cout << z1 << "伤" << z2 << "," << z2 << "现在生命为" << Zhu[z2].shengming el; 
	if (z2 == zhuzhu && Zhu[z1].tiaolema == 0) taidu[z1] = 1;
	if (silema(z2)) {
		if (Zhu[z1].shenfen == 1 && Zhu[z2].shenfen == 2) {
			cout << "主猪牌被清空" el;
			for (int i = 0 ; i < Zhu[z1].shoupai.size() ; i++) Zhu[z1].shoupai[i].vis = 1;
		}
		if (Zhu[z2].shenfen == 3) {
			cout << z1 << "摸3张牌" el;
			mopai(z1, 3);
		}
	}
}
// z能否成功使用无懈可击 
bool wuxiekeji(int z) {
	cout << z << "尝试用无懈" el;
	Zhu[z].tiaolema = 1;
	if (Zhu[z].shenfen == 1 || Zhu[z].shenfen == 2) { // 对于忠、主猪,只有反猪才会用无懈顶掉他们的无懈 
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2) continue;
			for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
				if (Zhu[i].shoupai[j].vis) continue;
				if (Zhu[i].shoupai[j].type == 7) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) { // 如果敌人用无懈成功,那他就失败 
						return 0;
					}
				}
			}
		}
		return 1; // 反之则成功 
	} else {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			cout << i << " x " << z el;
			if (Zhu[i].shenfen == 3) continue;
			for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
				if (Zhu[i].shoupai[j].vis) continue;
				if (Zhu[i].shoupai[j].type == 7) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) {
						return 0;
					}
				}
			}
		}
		return 1;
	}
}

void nanzhuruqin(int z) {
	cout << z << "南蛮" el; 
	for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
		bool wuxielema = 0;
		for (int k = z, fg = 0 ; ; k = youzhu[k]) {
			if (k == z && fg == 0) fg = 1;
			else if (k == z && fg == 1) break;
			if (Zhu[k].shenfen == 1 || Zhu[k].shenfen == 2) {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2)) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								cout << k << "对" << i << "用无懈" el; 
								wuxielema = 1;
								cout << k << "跳忠" el;
								break;
							}
						}
					}
				}
			} else {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && Zhu[i].shenfen == 3) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								cout << k << "对" << i << "用无懈" el; 
								wuxielema = 1;
								cout << k << "跳反" el;
								break;
							}
						}
					}
				}
			}
			if (wuxielema) break;
		}
		if (wuxielema) continue;
		int yongshalema = 0;
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 2 && yongshalema == 0) {
				Zhu[i].shoupai[j].vis = 1;
				yongshalema = 1;
			}
		}
		if (!yongshalema) shanghaipanding(z, i);
		else cout << i << "用杀抵掉了南蛮" el; 
	}
}

void wanjianqifa(int z) {
	cout << z << "万箭" el; 
	for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
		bool wuxielema = 0;
		for (int k = z, fg = 0 ; ; k = youzhu[k]) {
			if (k == z && fg == 0) fg = 1;
			else if (k == z && fg == 1) break;
			if (Zhu[k].shenfen == 1 || Zhu[k].shenfen == 2) {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2)) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								cout << k << "对" << i << "用无懈" el; 
								wuxielema = 1;
								cout << k << "跳忠" el;
								break;
							}
						}
					}
				}
			} else {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && Zhu[i].shenfen == 3) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								cout << k << "对" << i << "用无懈" el; 
								wuxielema = 1;
								cout << k << "跳反" el;
								break;
							}
						}
					}
				}
			}
			if (wuxielema) break;
		}
		if (wuxielema) continue;
		int yongshalema = 0;
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 3 && yongshalema == 0) {
				Zhu[i].shoupai[j].vis = 1;
				yongshalema = 1;
			}
		}
		if (!yongshalema) shanghaipanding(z, i);
		else cout << i << "用闪抵掉了万箭" el; 
	}
}

void sha(int z1, int z2) {
	cout << z1 << "杀" << z2 el; 
	Zhu[z1].tiaolema = 1;
	for (int i = 0 ; i < Zhu[z2].shoupai.size() ; i++) {
		if (Zhu[z2].shoupai[i].vis) continue;
		if (Zhu[z2].shoupai[i].type == 3) {
			Zhu[z2].shoupai[i].vis = 1;
			cout << z2 << "闪掉了" << z1 << "的杀" el;
			return ;
		}
	}
	shanghaipanding(z1, z2);
}

void juedou(int z1, int z2) {
	cout << z1 << "决斗" << z2 el; 
	Zhu[z1].tiaolema = 1;
	for (int i = youzhu[z1] ; i != z1 ; i = youzhu[i]) {
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 7 && Zhu[z2].tiaolema == 1) {
				if ((Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2) && (Zhu[z2].shenfen == 1 || Zhu[z2].shenfen == 2)) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) {
						cout << i << "对" << z2 << "用无懈" el; 
						return ;
					}
				} else  if (Zhu[i].shenfen == 3 && Zhu[z2].shenfen == 3) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) {
						cout << i << "对" << z2 << "用无懈" el; 
						return ;
					}
				}
			}
		}
	}
	
	Zhu[z1].tiaolema = 1;
	if (Zhu[z1].shenfen == 1 && Zhu[z2].shenfen == 2) shanghaipanding(z1, z2);
	else {
		while (1) {
			bool diusha1 = 0, diusha2 = 0;
			for (int i = 0 ; i < Zhu[z2].shoupai.size() ; i++) {
				if (Zhu[z2].shoupai[i].vis) continue;
				if (Zhu[z2].shoupai[i].type == 2) {
					Zhu[z2].shoupai[i].vis = 1;
					diusha1 = 1;
					break;
				}
			}
			if (diusha1 == 0) {
				shanghaipanding(z1, z2);
				return ;
			}
			for (int i = 0 ; i < Zhu[z1].shoupai.size() ; i++) {
				if (Zhu[z1].shoupai[i].vis) continue;
				if (Zhu[z1].shoupai[i].type == 2) {
					Zhu[z1].shoupai[i].vis = 1;
					diusha2 = 1;
					break;
				}
			}
			
			if (diusha2 == 0) {
				shanghaipanding(z2, z1);
				return ;
			}
		}
	} 
}

bool yongsha(int z, int i) {
	if (Zhu[z].shenfen == 1) {
		if ((taidu[youzhu[z]] == 1 && Zhu[youzhu[z]].tiaolema == 0) || (Zhu[youzhu[z]].shenfen == 3 && Zhu[youzhu[z]].tiaolema == 1)) {
			Zhu[z].shoupai[i].vis = 1;
			sha(z, youzhu[z]);
			return 1;
		}
	} else if (Zhu[z].shenfen == 2) {
		if (Zhu[youzhu[z]].shenfen == 3 && Zhu[youzhu[z]].tiaolema == 1) {
			Zhu[z].shoupai[i].vis = 1;
			Zhu[z].tiaolema = 1;
			sha(z, youzhu[z]);
			return 1;
		}
	} else {
		if (Zhu[youzhu[z]].shenfen == 1 || Zhu[youzhu[z]].shenfen == 2 && Zhu[youzhu[z]].tiaolema == 1) {
			Zhu[z].tiaolema = 1;
			Zhu[z].shoupai[i].vis = 1;
			sha(z, youzhu[z]);
			return 1;
		}
	}
	return 0;
}

bool yongjuedou(int z, int t) {
	if (Zhu[z].shenfen == 1) {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 3 && Zhu[i].tiaolema == 1 || (taidu[i] == 1 && Zhu[i].tiaolema == 0)) {
				Zhu[z].shoupai[t].vis = 1;
				juedou(z, i);
				return 1;
			}
		}
	} else if (Zhu[z].shenfen == 2) {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 3 && Zhu[i].tiaolema == 1) {
				Zhu[z].shoupai[t].vis = 1;
				juedou(z, i);
				return 1;
			}
		}
	} else {
		Zhu[z].shoupai[t].vis = 1;
		juedou(z, zhuzhu);
		return 1;
	}
	return 0;
}
// 能否用桃 ok 
bool yongtao(int z) {
	if (Zhu[z].shengming < 4) {
		Zhu[z].shengming++;
		cout << z << "吃桃" << "," << z << "现在生命为" << Zhu[z].shengming el;
		return 1;
	}
	return 0;
}

void chupai(int z) {
	//cout << z << "出牌" el;
	//for (PAI i : Zhu[z].shoupai) cout << i.type << ' ' << i.vis el;
	int yongshalema = 0;
	int yongnulema = 0;
	for (int i = 0 ; i < Zhu[z].shoupai.size() ; i++) {
		if (Zhu[z].shoupai[i].vis) continue;
		if (Zhu[z].shoupai[i].type == 1) {
			if (yongtao(z)) {
				Zhu[z].shoupai[i].vis = 1;
				i = -1;
			}
		}
		else if (Zhu[z].shoupai[i].type == 2) {
			if (yongshalema == 0) {
				if (yongsha(z, i)) {
					yongshalema = 1;
					i = -1;
				}
			} else if (yongshalema == 1 && Zhu[z].youwuliannu == 1) {
				if (yongsha(z, i)) {
					yongnulema = 1;
					i = -1;
				}
			}
		} 
		else if (Zhu[z].shoupai[i].type == 4) {
			if (yongjuedou(z, i)) i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 5) {
			Zhu[z].shoupai[i].vis = 1;
			nanzhuruqin(z);
			i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 6) {
			Zhu[z].shoupai[i].vis = 1;
			wanjianqifa(z);
			i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 8) {
			Zhu[z].youwuliannu = 1;
			Zhu[z].shoupai[i].vis = 1;
			cout << z << "用弩" el;
			i = -1;
		}
	}
	if (yongnulema == 1) Zhu[z].youwuliannu = 0;
}
// 发牌 ok
void f() {
	f();
}
void fapai() {
	cin >> zhu >> pai;
	for (int i = 1 ; i < zhu ; i++) {
		youzhu[i] = i + 1;
		zuozhu[i + 1] = i;
	}
	youzhu[zhu] = 1;
	zuozhu[1] = zhu;
	for (int i = 1 ; i <= zhu ; i++) {
		cin >> tmpa >> tmpb >> tmpc >> tmpd >> tmpe;
		if (tmpa == "MP") {
			Zhu[i].shenfen = 1;
			zhuzhu = i;
			Zhu[i].tiaolema = 1;
		}
		else if (tmpa == "ZP") Zhu[i].shenfen = 2;
		else if (tmpa == "FP") Zhu[i].shenfen = 3;
		Zhu[i].shoupai.push_back({zheng[tmpb], 0});
		Zhu[i].shoupai.push_back({zheng[tmpc], 0});
		Zhu[i].shoupai.push_back({zheng[tmpd], 0});
		Zhu[i].shoupai.push_back({zheng[tmpe], 0});
	}
	for (int i = 1 ; i <= pai ; i++) {
		cin >> tmpb;
		paidui.push(zheng[tmpb]);
	}
}
//打牌 ok 
void dapai() {
	while (1) {
		for (int i = zhuzhu; ; i = youzhu[i]) {
			mopai(i, 2);
			chupai(i);
		}
	}	
}
// 主函数 ok 
signed main() {
	fapai();
	dapai();
	return 0;
}

提交版(无过程):

#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <map>
#include <set>
#include <cstdlib>
#include <utility>
#include <deque>
#include <unordered_map>
using namespace std;
#define hfmx 0x3f3f3f3f / 2
#define ts cout << "tt" << endl;
#define sf(x) for(register int i = 1 ; i <= x ; i++)
#define reg register
#define fi first
#define se second
#define mmx(x) memset(x, 0x3f, sizeof x)
#define mmn(x) memset(x, -0x3f, sizeof x)
#define fu1(x) memset(x, -1, sizeof x)
#define zr(x) memset(x, 0, sizeof x)
#define el << endl
#define bl << ' ' <<
#define pii pair<int, int>
struct PAI{
	int type;
	bool vis;
};
struct ZHU{ // 猪 
	int shenfen; // 1主 2忠 3反 
	int shengming = 4; // 生命值 
	bool sihuo = 1; // 是死是活 
	bool tiaolema = 0; // 是否表明身份  
	bool youwuliannu = 0;
	int nuid = 0;
	vector<PAI> shoupai; // 1桃 2杀 3闪 4决斗 5南猪入侵 6万箭齐发 7无懈可击
};
int zhu; // 猪的数量 
int pai; // 牌堆的数量 
int zhuzhu; // 开始的猪 
string tmpa;
char tmpb, tmpc, tmpd, tmpe;
queue<int> paidui; // 牌堆 
ZHU Zhu[20]; // 每只猪 
int youzhu[20]; // 右猪, 逆时针 
int zuozhu[20]; // 左猪, 顺时针
int taidu[20]; // 是否类反 
bool jieshu;
map<char, int> zheng = {{'P', 1}, {'K', 2}, {'D', 3}, {'F', 4}, {'N', 5}, {'W', 6}, {'J', 7}, {'Z', 8}};
map<int, char> fan = {{1, 'P'}, {2, 'K'}, {3, 'D'}, {4, 'F'}, {5, 'N'}, {6, 'W'}, {7, 'J'}, {8, 'Z'}};
// 双方输赢 ok 
bool zhuzhuyinglema() {
	if (Zhu[zhuzhu].sihuo == 0) return 0;
	for (int i = 1 ; i <= zhu ; i++) {
		if (Zhu[i].shenfen == 3 && Zhu[i].sihuo == 1) {
			return 0;
		}
	}
	return 1;
}
void shuchu() {
	if (zhuzhuyinglema()) cout << "MP\n";
	else if (Zhu[zhuzhu].sihuo == 0) cout << "FP\n";
	else return ;
	for (int i = 1 ; i <= zhu ; i++) {
		if (Zhu[i].sihuo == 0) cout << "DEAD";
		else {
			for (PAI j : Zhu[i].shoupai) {
				if (j.vis) continue;
				cout << fan[j.type] << ' ';
			}
		}
		cout << endl;
	}
	exit(0);
}
bool silema(int z) { // 死没死?及死后处理 
	if (Zhu[z].shengming == 0) {
		for (int i = 0 ; i < Zhu[z].shoupai.size() ; i++){
			if (Zhu[z].shoupai[i].vis) continue;
			if (Zhu[z].shoupai[i].type == 1) {
				Zhu[z].shoupai[i].vis = 1;
				Zhu[z].shengming++;
				return 0;
			}
		}
		youzhu[zuozhu[z]] = youzhu[z];
		zuozhu[youzhu[z]] = zuozhu[z];
		Zhu[z].sihuo = 0;
		shuchu(); 
		return 1;
	}
	return 0;
}
// 摸牌 ok 
void mopai(int z, int c) {
	while (c--) {
		int xinpai = paidui.front();
		Zhu[z].shoupai.push_back({xinpai, 0});
		if (paidui.size() > 1) paidui.pop();
	}
}
void shanghaipanding(int z1, int z2) { // 造成伤害后的判定 
	Zhu[z2].shengming--;
	if (z2 == zhuzhu && Zhu[z1].tiaolema == 0) taidu[z1] = 1;
	if (silema(z2)) {
		if (Zhu[z1].shenfen == 1 && Zhu[z2].shenfen == 2) {
			for (int i = 0 ; i < Zhu[z1].shoupai.size() ; i++) Zhu[z1].shoupai[i].vis = 1;
		}
		if (Zhu[z2].shenfen == 3) {
			mopai(z1, 3);
		}
	}
}
// z能否成功使用无懈可击 
bool wuxiekeji(int z) {
	Zhu[z].tiaolema = 1;
	if (Zhu[z].tiaolema == 0) return 1;
	if (Zhu[z].shenfen == 1 || Zhu[z].shenfen == 2) { // 对于忠、主猪,只有反猪才会用无懈顶掉他们的无懈 
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2) continue;
			for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
				if (Zhu[i].shoupai[j].vis) continue;
				if (Zhu[i].shoupai[j].type == 7) {
					Zhu[i].shoupai[j].vis = 1;
					Zhu[i].tiaolema = 1;
					if (wuxiekeji(i)) { // 如果敌人用无懈成功,那他就失败 
						return 0;
					}
				}
			}
		}
		return 1; // 反之则成功 
	} else {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 3) continue;
			for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
				if (Zhu[i].shoupai[j].vis) continue;
				if (Zhu[i].shoupai[j].type == 7) {
					Zhu[i].shoupai[j].vis = 1;
					Zhu[i].tiaolema = 1;
					if (wuxiekeji(i)) {
						return 0;
					}
				}
			}
		}
		return 1;
	}
}

void nanzhuruqin(int z) {
	for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
		bool wuxielema = 0;
		for (int k = z, fg = 0 ; ; k = youzhu[k]) {
			if (k == z && fg == 0) fg = 1;
			else if (k == z && fg == 1) break;
			if (Zhu[k].shenfen == 1 || Zhu[k].shenfen == 2) {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2)) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								wuxielema = 1;
								break;
							}
						}
					}
				}
			} else {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && Zhu[i].shenfen == 3) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								wuxielema = 1;
								break;
							}
						}
					}
				}
			}
			if (wuxielema) break;
		}
		if (wuxielema) continue;
		int yongshalema = 0;
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 2 && yongshalema == 0) {
				Zhu[i].shoupai[j].vis = 1;
				yongshalema = 1;
			}
		}
		if (!yongshalema) shanghaipanding(z, i);
	}
}

void wanjianqifa(int z) {
	for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
		bool wuxielema = 0;
		for (int k = z, fg = 0 ; ; k = youzhu[k]) {
			if (k == z && fg == 0) fg = 1;
			else if (k == z && fg == 1) break;
			if (Zhu[k].shenfen == 1 || Zhu[k].shenfen == 2) {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && (Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2)) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								wuxielema = 1;
								break;
							}
						}
					}
				}
			} else {
				for (int j = 0 ; j < Zhu[k].shoupai.size() ; j++) {
					if (Zhu[k].shoupai[j].vis) continue;
					if (Zhu[k].shoupai[j].type == 7) {
						if (Zhu[i].tiaolema == 1 && Zhu[i].shenfen == 3) {
							Zhu[k].shoupai[j].vis = 1;
							if (wuxiekeji(k)) {
								wuxielema = 1;
								break;
							}
						}
					}
				}
			}
			if (wuxielema) break;
		}
		if (wuxielema) continue;
		int yongshalema = 0;
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 3 && yongshalema == 0) {
				Zhu[i].shoupai[j].vis = 1;
				yongshalema = 1;
			}
		}
		if (!yongshalema) shanghaipanding(z, i);
	}
}

void sha(int z1, int z2) {
	Zhu[z1].tiaolema = 1;
	for (int i = 0 ; i < Zhu[z2].shoupai.size() ; i++) {
		if (Zhu[z2].shoupai[i].vis) continue;
		if (Zhu[z2].shoupai[i].type == 3) {
			Zhu[z2].shoupai[i].vis = 1;
			return ;
		}
	}
	shanghaipanding(z1, z2);
}

void juedou(int z1, int z2) {
	Zhu[z1].tiaolema = 1;
	for (int i = youzhu[z1] ; i != z1 ; i = youzhu[i]) {
		for (int j = 0 ; j < Zhu[i].shoupai.size() ; j++) {
			if (Zhu[i].shoupai[j].vis) continue;
			if (Zhu[i].shoupai[j].type == 7 && Zhu[z2].tiaolema == 1) {
				if ((Zhu[i].shenfen == 1 || Zhu[i].shenfen == 2) && (Zhu[z2].shenfen == 1 || Zhu[z2].shenfen == 2)) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) {
						return ;
					}
				} else  if (Zhu[i].shenfen == 3 && Zhu[z2].shenfen == 3) {
					Zhu[i].shoupai[j].vis = 1;
					if (wuxiekeji(i)) {
						return ;
					}
				}
			}
		}
	}
	if (Zhu[z1].shenfen == 1 && Zhu[z2].shenfen == 2) shanghaipanding(z1, z2);
	else {
		while (1) {
			int diusha1 = 0, diusha2 = 0;
			for (int i = 0 ; i < Zhu[z2].shoupai.size() ; i++) {
				if (Zhu[z2].shoupai[i].vis) continue;
				if (Zhu[z2].shoupai[i].type == 2) {
					Zhu[z2].shoupai[i].vis = 1;
					diusha1 = 1;
					break;
				}
			}
			if (diusha1 == 0) {
				shanghaipanding(z1, z2);
				return ;
			}
			for (int i = 0 ; i < Zhu[z1].shoupai.size() ; i++) {
				if (Zhu[z1].shoupai[i].vis) continue;
				if (Zhu[z1].shoupai[i].type == 2) {
					Zhu[z1].shoupai[i].vis = 1;
					diusha2 = 1;
					break;
				}
			}
			
			if (diusha2 == 0) {
				shanghaipanding(z2, z1);
				return ;
			}
		}
	} 
}

bool yongsha(int z, int i) {
	if (Zhu[z].shenfen == 1) {
		if ((taidu[youzhu[z]] == 1 && Zhu[youzhu[z]].tiaolema == 0) || (Zhu[youzhu[z]].shenfen == 3 && Zhu[youzhu[z]].tiaolema == 1)) {
			Zhu[z].shoupai[i].vis = 1;
			sha(z, youzhu[z]);
			
			return 1;
		}
	} else if (Zhu[z].shenfen == 2) {
		if (Zhu[youzhu[z]].shenfen == 3 && Zhu[youzhu[z]].tiaolema == 1) {
			Zhu[z].shoupai[i].vis = 1;
			Zhu[z].tiaolema = 1;
			sha(z, youzhu[z]);
			return 1;
		}
	} else {
		if (Zhu[youzhu[z]].shenfen == 1 || Zhu[youzhu[z]].shenfen == 2 && Zhu[youzhu[z]].tiaolema == 1) {
			Zhu[z].tiaolema = 1;
			Zhu[z].shoupai[i].vis = 1;
			sha(z, youzhu[z]);
			return 1;
		}
	}
	return 0;
}

bool yongjuedou(int z, int t) {
	if (Zhu[z].shenfen == 1) {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 3 && Zhu[i].tiaolema == 1 || (taidu[i] == 1 && Zhu[i].tiaolema == 0)) {
				Zhu[z].shoupai[t].vis = 1;
				juedou(z, i);
				return 1;
			}
		}
	} else if (Zhu[z].shenfen == 2) {
		for (int i = youzhu[z] ; i != z ; i = youzhu[i]) {
			if (Zhu[i].shenfen == 3 && Zhu[i].tiaolema == 1) {
				Zhu[z].shoupai[t].vis = 1;
				juedou(z, i);
				return 1;
			}
		}
	} else {
		Zhu[z].shoupai[t].vis = 1;
		juedou(z, zhuzhu);
		return 1;
	}
	return 0;
}
// 能否用桃 ok 
bool yongtao(int z) {
	if (Zhu[z].shengming < 4) {
		Zhu[z].shengming++;
		return 1;
	}
	return 0;
}

void chupai(int z) {
	int yongshalema = 0;
	int yongnulema = 0;
	for (int i = 0 ; i < Zhu[z].shoupai.size() ; i++) {
		if (Zhu[z].shoupai[i].vis) continue;
		if (Zhu[z].shoupai[i].type == 1) {
			if (yongtao(z)) {
				Zhu[z].shoupai[i].vis = 1;
				i = -1;
			}
		}
		else if (Zhu[z].shoupai[i].type == 2) {
			if (yongshalema == 0) {
				if (yongsha(z, i)) {
					yongshalema = 1;
					i = -1;
				}
			} else if (yongshalema == 1 && Zhu[z].youwuliannu == 1) {
				if (yongsha(z, i)) {
					yongnulema = 1;
					i = -1;
				}
			}
		} 
		else if (Zhu[z].shoupai[i].type == 4) {
			if (yongjuedou(z, i)) i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 5) {
			Zhu[z].shoupai[i].vis = 1;
			nanzhuruqin(z);
			i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 6) {
			Zhu[z].shoupai[i].vis = 1;
			wanjianqifa(z);
			i = -1;
		}
		else if (Zhu[z].shoupai[i].type == 8) {
			Zhu[z].youwuliannu = 1;
			Zhu[z].shoupai[i].vis = 1;
			i = -1;
		}
	}
	if (yongnulema == 1) Zhu[z].youwuliannu = 0;
}
// 发牌 ok
void fapai() {
	cin >> zhu >> pai;
	for (int i = 1 ; i < zhu ; i++) {
		youzhu[i] = i + 1;
		zuozhu[i + 1] = i;
	}
	youzhu[zhu] = 1;
	zuozhu[1] = zhu;
	for (int i = 1 ; i <= zhu ; i++) {
		cin >> tmpa >> tmpb >> tmpc >> tmpd >> tmpe;
		if (tmpa == "MP") {
			Zhu[i].shenfen = 1;
			zhuzhu = i;
			Zhu[i].tiaolema = 1;
		}
		else if (tmpa == "ZP") Zhu[i].shenfen = 2;
		else if (tmpa == "FP") Zhu[i].shenfen = 3;
		Zhu[i].shoupai.push_back({zheng[tmpb], 0});
		Zhu[i].shoupai.push_back({zheng[tmpc], 0});
		Zhu[i].shoupai.push_back({zheng[tmpd], 0});
		Zhu[i].shoupai.push_back({zheng[tmpe], 0});
	}
	for (int i = 1 ; i <= pai ; i++) {
		cin >> tmpb;
		paidui.push(zheng[tmpb]);
	}
}
//打牌 ok 
void dapai() {
	while (Zhu[zhuzhu].sihuo) {
		for (int i = zhuzhu; ; i = youzhu[i]) {
			mopai(i, 2);
			chupai(i);
			shuchu();
		}
	}
	cout << "FP\n";
	for (int i = 1 ; i <= zhu ; i++) {
		if (Zhu[i].sihuo == 0) cout << "DEAD";
		else {
			for (PAI j : Zhu[i].shoupai) {
				if (j.vis) continue;
				cout << fan[j.type] << ' ';
			}
		}
		cout << endl;
	}
	exit(0);
}
// 主函数 ok 
signed main() {
	//freopen("out.txt", "w", stdout);
	fapai();
	dapai();
	return 0;
}
2024/8/20 17:10
加载中...