"""#include \n#include \n#include \n#include \n\nusing namespace std;\n\n// 定义玩家类\nclass Player {\npublic:\n string role; // 角色类型 (ZG: 主公, ZC: 忠臣, FZ: 反贼)\n vector hand; // 手牌\n int health; // 体力值\n int distanceToLord; // 到主公的距离\n bool isRebel; // 是否是反贼 (跳反)\n bool isLoyal; // 是否是忠臣 (跳忠)\n bool isClassRebel; // 是否是类反贼\n\n Player(string r, vector h, int hp) : role(r), hand(h), health(hp), isRebel(false), isLoyal(false), isClassRebel(false) {\n // 初始化玩家距离主公的距离\n // 这里假设主公编号为 1\n distanceToLord = 1;\n }\n\n // 摸牌\n void DrawCards(vector& deck) {\n for (int i = 0; i < 2; i++) {\n hand.push_back(deck.back());\n deck.pop_back();\n }\n }\n\n // 使用杀\n bool UseKill(Player* target) {\n // 判断是否拥有杀\n if (find(hand.begin(), hand.end(), "K") != hand.end()) {\n // 移除杀\n hand.erase(remove(hand.begin(), hand.end(), "K"), hand.end());\n // 对目标造成伤害\n target->health--;\n return true; // 使用成功\n } else {\n return false; // 使用失败\n }\n }\n\n // 使用桃\n bool UsePeach() {\n if (find(hand.begin(), hand.end(), "P") != hand.end() && health < 4) {\n hand.erase(remove(hand.begin(), hand.end(), "P"), hand.end());\n health++;\n return true; // 使用成功\n } else {\n return false; // 使用失败\n }\n }\n\n // 使用决斗\n void UseDuel(Player* target, vector& deck) {\n // 移除决斗\n hand.erase(remove(hand.begin(), hand.end(), "F"), hand.end());\n // 轮流弃置杀\n while (true) {\n // 玩家弃置杀\n if (find(hand.begin(), hand.end(), "K") != hand.end()) {\n hand.erase(remove(hand.begin(), hand.end(), "K"), hand.end());\n } else {\n // 玩家没有杀,受到伤害\n health--;\n // 伤害来源为目标玩家\n break; // 结束决斗\n }\n // 目标弃置杀\n if (find(target->hand.begin(), target->hand.end(), "K") != target->hand.end()) {\n target->hand.erase(remove(target->hand.begin(), target->hand.end(), "K"), target->hand.end());\n } else {\n // 目标没有杀,受到伤害\n target->health--;\n // 伤害来源为当前玩家\n break; // 结束决斗\n }\n }\n }\n\n // 使用南蛮入侵\n void UseSouthBarbarian(vector& players, vector& deck) {\n // 移除南蛮入侵\n hand.erase(remove(hand.begin(), hand.end(), "N"), hand.end());\n // 遍历所有玩家\n for (int i = 0; i < players.size(); i++) {\n // 玩家与当前玩家不是同一个\n if (&players[i] != this) {\n // 玩家弃置杀\n if (find(players[i].hand.begin(), players[i].hand.end(), "K") != players[i].hand.end()) {\n players[i].hand.erase(remove(players[i].hand.begin(), players[i].hand.end(), "K"), players[i].hand.end());\n } else {\n // 玩家没有杀,受到伤害\n players[i].health--;\n }\n }\n }\n }\n\n // 使用万箭齐发\n void UseArrowRain(vector& players, vector& deck) {\n // 移除万箭齐发\n hand.erase(remove(hand.begin(), hand.end(), "W"), hand.end());\n // 遍历所有玩家\n for (int i = 0; i < players.size(); i++) {\n // 玩家与当前玩家不是同一个\n if (&players[i] != this) {\n // 玩家弃置闪\n if (find(players[i].hand.begin(), players[i].hand.end(), "D") != players[i].hand.end()) {\n players[i].hand.erase(remove(players[i].hand.begin(), players[i].hand.end(), "D"), players[i].hand.end());\n } else {\n // 玩家没有闪,受到伤害\n players[i].health--;\n }\n }\n }\n }\n\n // 使用无懈可击\n bool UseIndestructible(vector& deck) {\n if (find(hand.begin(), hand.end(), "J") != hand.end()) {\n hand.erase(remove(hand.begin(), hand.end(), "J"), hand.end());\n return true; // 使用成功\n } else {\n return false; // 使用失败\n }\n }\n\n // 装备诸葛连弩\n void EquipCrossbow(vector& deck) {\n if (find(hand.begin(), hand.end(), "Z") != hand.end()) {\n hand.erase(remove(hand.begin(), hand.end(), "Z"), hand.end());\n }\n }\n\n // 响应杀\n bool RespondToKill(vector& deck) {\n if (find(hand.begin(), hand.end(), "D") != hand.end()) {\n hand.erase(remove(hand.begin(), hand.end(), "D"), hand.end());\n return true; // 响应成功\n } else {\n return false; // 响应失败\n }\n }\n\n // 响应南蛮入侵或万箭齐发\n bool RespondToSouthBarbarianOrArrowRain(vector& deck) {\n if (find(hand.begin(), hand.end(), "K") != hand.end()) {\n hand.erase(remove(hand.begin(), hand.end(), "K"), hand.end());\n return true; // 响应成功\n } else {\n return false; // 响应失败\n }\n }\n\n // 响应无懈可击\n bool RespondToIndestructible(vector& deck) {\n // 无懈可击只能在使用无懈可击的时候使用\n return false; // 响应失败\n }\n};\n\n// 游戏逻辑函数\nbool PlayGame(vector& players, vector& deck) {\n // 游戏结束标志\n bool gameOver = false; \n // 当前行动玩家\n int currentPlayerIndex = 0; \n // 主公指针\n Player* lord = &players[0]; \n // 遍历所有玩家\n while (!gameOver) {\n Player& currentPlayer = players[currentPlayerIndex]; \n // 如果玩家已阵亡\n if (currentPlayer.health <= 0) {\n currentPlayerIndex = (currentPlayerIndex + 1) % players.size();\n continue; // 跳过当前玩家\n }\n // 摸牌\n currentPlayer.DrawCards(deck);\n // 使用桃\n if (currentPlayer.UsePeach()) {\n continue; // 跳过其他行动\n }\n // 使用装备\n if (find(currentPlayer.hand.begin(), currentPlayer.hand.end(), "Z") != currentPlayer.hand.end()) {\n currentPlayer.EquipCrossbow(deck);\n }\n // 攻击逻辑\n if (currentPlayer.role == "ZG") {\n // 主公的攻击逻辑\n // 找到下一个类反贼或已跳反贼\n int targetIndex = (currentPlayerIndex + 1) % players.size();\n while (targetIndex != currentPlayerIndex) {\n if (players[targetIndex].isRebel || players[targetIndex].isClassRebel) {\n // 找到目标\n if (currentPlayer.UseKill(&players[targetIndex])) {\n break; // 攻击成功,结束攻击\n }\n }\n targetIndex = (targetIndex + 1) % players.size();\n }\n } else if (currentPlayer.role == "ZC") {\n // 忠臣的攻击逻辑\n // 找到下一个已跳反贼\n int targetIndex = (currentPlayerIndex + 1) % players.size();\n while (targetIndex != currentPlayerIndex) {\n if (players[targetIndex].isRebel) {\n // 找到目标\n if (currentPlayer.UseKill(&players[targetIndex])) {\n break; // 攻击成功,结束攻击\n }\n }\n targetIndex = (targetIndex + 1) % players.size();\n }\n } else if (currentPlayer.role == "FZ") {\n // 反贼的攻击逻辑\n // 优先攻击主公\n if (currentPlayer.UseKill(lord)) {\n // 攻击成功,结束攻击\n } else {\n // 找到下一个已跳忠\n int targetIndex = (currentPlayerIndex + 1) % players.size();\n while (targetIndex != currentPlayerIndex) {\n if (players[targetIndex].isLoyal) {\n // 找到目标\n if (currentPlayer.UseKill(&players[targetIndex])) {\n break; // 攻击成功,结束攻击\n }\n }\n targetIndex = (targetIndex + 1) % players.size();\n }\n }\n }\n // 使用锦囊牌\n // 南蛮入侵\n if (find(currentPlayer.hand.begin(), currentPlayer.hand.end(), "N") != currentPlayer.hand.end()) {\n currentPlayer.UseSouthBarbarian(players, deck);\n }\n // 万箭齐发\n if (find(currentPlayer.hand.begin(), currentPlayer.hand.end(), "W") != currentPlayer.hand.end()) {\n currentPlayer.UseArrowRain(players, deck);\n }\n // 决斗\n if (find(currentPlayer.hand.begin(), currentPlayer.hand.end(), "F") != currentPlayer.hand.end()) {\n // 决斗目标\n int targetIndex = (currentPlayerIndex + 1) % players.size();\n // 找到下一个玩家 (不能是自己)\n while (targetIndex != currentPlayerIndex) {\n // 主公决斗\n if (currentPlayer.role == "ZG") {\n currentPlayer.UseDuel(&players[targetIndex], deck);\n break; // 结束决斗\n // 忠臣决斗\n } else if (currentPlayer.role == "ZC") {\n // 如果目标是主公,不弃置杀\n if (&players[targetIndex] == lord) {\n break; // 结束决斗\n } else {\n currentPlayer.UseDuel(&players[targetIndex], deck);\n break; // 结束决斗\n }\n // 反贼决斗\n } else if (currentPlayer.role == "FZ") {\n currentPlayer.UseDuel(&players[targetIndex], deck);\n break; // 结束决斗\n }\n targetIndex = (targetIndex + 1) % players.size();\n }\n }\n // 判断游戏是否结束\n // 主公胜利\n if (lord->health > 0) {\n int rebelCount = 0;\n for (int i = 0; i < players.size(); i++) {\n if (players[i].role == "FZ" && players[i].health > 0) {\n rebelCount++;\n }\n }\n // 反贼全部阵亡\n if (rebelCount == 0) {\n gameOver = true; // 游戏结束\n }\n } else {\n gameOver = true; // 游戏结束\n }\n // 切换到下一个玩家\n currentPlayerIndex = (currentPlayerIndex + 1) % players.size();\n }\n return lord->health > 0; // 返回游戏结果\n}\n\nint main() {\n int n, m; // 玩家数量和牌堆数量\n cin >> n >> m; // 输入玩家数量和牌堆数量\n vector players; // 玩家列表\n vector deck(m); // 牌堆\n // 输入玩家信息\n for (int i = 0; i < n; i++) {\n string role; // 角色\n vector hand(4); // 手牌\n int health; // 体力\n cin >> role >> hand[0] >> hand[1] >> hand[2] >> hand[3] >> health; // 输入角色、手牌和体力\n players.push_back(Player(role, hand, health)); // 创建玩家对象并加入列表\n }\n // 输入牌堆\n for (int i = 0; i < m; i++) {\n cin >> deck[i]; // 输入牌\n }\n // 开始游戏\n bool lordWins = PlayGame(players, deck); // 执行游戏逻辑\n // 输出游戏结果\n if (lordWins) {\n cout << "MP" << endl; // 主公胜利\n } else {\n cout << "FP" << endl; // 反贼胜利\n }\n // 输出玩家手牌信息\n for (int i = 0; i < players.size(); i++) {\n if (players[i].health <= 0) {\n cout << "DEAD" << endl; // 玩家已阵亡\n } else {\n for (int j = 0; j < players[i].hand.size(); j++) {\n cout << players[i].hand[j] << " ";\n }\n cout << endl; // 输出换行\n }\n }\n return 0;\n}\n""\