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;
}