题目:解药毒药

这是一篇关于利用BFS解决寻找最少药剂组合问题的博客。题目描述了一个场景,机灵鼠研制的药可能会引发其他病症,需要找出治愈所有病症的最少药剂组合。博客提供了输入输出格式、样例,并提到了当无法治愈所有病症时的特殊情况。博主分享了一篇BFS模板链接,并给出了解题代码。

题目描述

描述 Description  
  羽毛笔和im是抽签到同一个考场的,她们突然闻到一阵刺鼻的化学试剂的气味。  
  机灵鼠:(头都不抬)你们是考生么?还在门口磨蹭什么?快进来帮我忙!!……怎么还不进来?你们拖赛,拖赛,把你们的青春都拖掉赛……
  im:开…开策了>_<
  羽毛笔:哎呀~~机灵鼠大人要我们帮什么忙?^^
  机灵鼠:你们看这里的这些药,都是我研制的对付各种症状的解药。可是我一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症……(im:那…那是解药还是毒药啊?!)……经过我天才的努力(背景:我是天才!!),终于弄清了每种药的具体性能(路人甲:那是你自己配的吗?-_-),我会把每种药能治的病症和能使人患上的病症列一张清单给你们,然后你们要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声,病症的数目不超过10种(小呆:偶是好人吧^^),我的药是用不完的,就是说每种药剂都可以被重复使用。
  给你们的单子里第一行是病症的总数n,第二行是药剂的种类m(0< m<=100),以下有m行,每行有n个数字用空格隔开,文件的第i+2行的n个数字中,如果第j个数为1,就表示第i种药可以治愈病症j(如果患有这种病的话则治愈,没有这种病则无影响),如果为0表示无影响,如果为-1表示反而能使人得上这种病(无病患上,有病无影响)。我制的药任何两种性能都不同。你们只要给我用的最少的药剂数就可以了。给你们个样例:

输入输出格式

输入格式:

输出格式:

输入输出样例


输入样例#1:

3
2
1 0 1
-1 1 0 



输出样例#1:

2


提示信息

  其实还有可能用尽了所有的药也不能将所有病治愈(真是不好意思嗬^^bb),那样的话你们只要写上“The patient will be dead.”就可以了。
  im:做不出来啊~~哇啊啊啊~~(

#include <iostream> #include <cstring> using namespace std; int t, n, a[25], m; int dead_count; bool used[25], alive[25], dead_note[25]; bool potion[25], antidote[25], usedone[25], hunter_sl[25]; bool arcp[25], arca[25], arcl[25]; bool check(int sub, int op1, int op2){ const int ID = a[op1]; // identity if(op1 > n || op2 > n || op1 < 1 || op2 < 1) return false; if(ID == 2) return false; if(ID == 1 && sub != 0) return false; if(ID == 3 && sub != 3) return false; if(ID == 4 && sub != 1 && sub != 2) return false; if(used[op1]) return false; if(sub == 0) { if(op1 == op2) return false; if(!alive[op2]) return false; } if(sub == 1) { if(op1 == op2) return false; if(!alive[op2]) return false; if(!potion[op1]) return false; if(usedone[op1]) return false; } if(sub == 2) { if(!antidote[op1]) return false; if(usedone[op1]) return false; if(op1 != op2 && !dead_note[op2]) return false; } if(sub == 3) { if(op1 == op2) return false; if(!alive[op2]) return false; if(alive[op1]) return false; } return true; } void operate(int sub, int op1, int op2){ const int ID = a[op1]; // identity // 1-wolf, 2-villager, 3-hunter, 4-witch used[op1] = true; if(ID == 1 && sub == 0){ alive[op2] = false; dead_note[op2] = true; }else if(ID == 3 && sub == 3){ hunter_sl[op1] = true; alive[op2] = false; dead_note[op2] = true; }else if(ID == 4 && sub == 1){ alive[op2] = false; potion[op1] = false; usedone[op1] = true; dead_note[op2] = true; }else if(ID == 4 && sub == 2){ alive[op2] = true; antidote[op1] = false; usedone[op1] = true; dead_note[op2] = false; } return; } void roll(){ cout << "Wrong" << endl; memcpy(alive, arcl, sizeof arcl); memcpy(potion, arcp, sizeof arcp); memcpy(antidote, arca, sizeof arca); } int main(void){ cin >> t >> n; for(int i=1; i<=n; ++i) cin >> a[i]; memset(alive, true, sizeof alive); memset(potion, true, sizeof potion); memset(antidote, true, sizeof antidote); for(int k=1; k<=t; ++k){ memset(used, false, sizeof used); memset(dead_note, false, sizeof dead_note); memset(usedone, false, sizeof usedone); memset(hunter_sl, false, sizeof hunter_sl); memcpy(arcl, alive, sizeof alive); memcpy(arcp, potion, sizeof potion); memcpy(arca, antidote, sizeof antidote); cin >> m; bool flag = false; for(int i=1, op, t1, t2; i<=m; ++i){ dead_count = 0; cin >> op >> t1 >> t2; if(!check(op, t1, t2)){ roll(); flag = true; break; }else operate(op, t1, t2); } if(flag) continue; for(int i=1; i<=20; ++i, flag = (a[i] == 3) && (alive[i]) || (!alive[i] && !hunter_sl[i])); if(flag){ roll(); continue; } bool d = false; for(int i=1; i<=20; ++i) if(dead_note[i]) d = true; if(!d){ cout << "Safe" << endl; continue; } dead_count = 0; for(int i=1; i<=20; ++i) if(dead_note[i]) dead_count++; cout << dead_count << " "; for(int i=1; i<=20; ++i) if(dead_note[i]) cout << i << " "; cout << endl; } return 0; }
10-17
C++ 狼人杀代码中实现女巫解药毒药功能,可在原代码基础上对 `WerewolfGame` 类进行扩展。以下是修改后的代码示例: ```cpp #include <iostream> #include <vector> #include <string> #include <cstdlib> #include <ctime> // 玩家类 class Player { public: std::string role; bool isAlive; Player(const std::string& r) : role(r), isAlive(true) {} }; // 狼人杀游戏类 class WerewolfGame { private: std::vector<Player> players; int numPlayers; bool hasUsedAntidote; bool hasUsedPoison; // 分配角色 void assignRoles() { std::vector<std::string> roles = {"狼人", "村民", "预言家", "女巫", "猎人"}; srand(time(0)); for (int i = 0; i < numPlayers; ++i) { int randomIndex = rand() % roles.size(); players.emplace_back(roles[randomIndex]); } } public: WerewolfGame(int n) : numPlayers(n), hasUsedAntidote(false), hasUsedPoison(false) { assignRoles(); } // 显示玩家信息 void showPlayers() { for (int i = 0; i < numPlayers; ++i) { std::cout << "玩家 " << i + 1 << " 角色: " << players[i].role; if (players[i].isAlive) { std::cout << " 存活" << std::endl; } else { std::cout << " 死亡" << std::endl; } } } // 狼人杀人 void werewolfKill(int target) { if (target >= 0 && target < numPlayers && players[target].isAlive) { if (!hasUsedAntidote) { std::cout << "女巫是否使用解药救玩家 " << target + 1 << "?(1: 使用, 0: 不使用) "; int useAntidote; std::cin >> useAntidote; if (useAntidote) { hasUsedAntidote = true; std::cout << "女巫使用了解药,玩家 " << target + 1 << " 被救活" << std::endl; return; } } players[target].isAlive = false; std::cout << "狼人杀死了玩家 " << target + 1 << std::endl; } else { std::cout << "无效的目标选择" << std::endl; } } // 女巫使用毒药 void witchUsePoison(int target) { if (!hasUsedPoison && target >= 0 && target < numPlayers && players[target].isAlive) { players[target].isAlive = false; hasUsedPoison = true; std::cout << "女巫使用了毒药,玩家 " << target + 1 << " 死亡" << std::endl; } else { std::cout << "无法使用毒药,可能是毒药已使用或目标无效" << std::endl; } } // 检查游戏是否结束 bool isGameOver() { int werewolfCount = 0; int villagerCount = 0; for (const auto& player : players) { if (player.isAlive) { if (player.role == "狼人") { ++werewolfCount; } else { ++villagerCount; } } } return werewolfCount == 0 || villagerCount == 0; } }; int main() { int numPlayers = 5; WerewolfGame game(numPlayers); std::cout << "游戏开始,玩家信息如下:" << std::endl; game.showPlayers(); // 模拟狼人杀人 game.werewolfKill(2); std::cout << "狼人行动后,玩家信息如下:" << std::endl; game.showPlayers(); // 模拟女巫使用毒药 game.witchUsePoison(3); std::cout << "女巫使用毒药后,玩家信息如下:" << std::endl; game.showPlayers(); if (game.isGameOver()) { std::cout << "游戏结束" << std::endl; } else { std::cout << "游戏继续" << std::endl; } return 0; } ``` 在上述代码中,在 `WerewolfGame` 类里添加了 `hasUsedAntidote` 和 `hasUsedPoison` 两个布尔变量,用于记录女巫是否使用了解药毒药。在 `werewolfKill` 函数中,当狼人杀人时,若女巫解药未使用,会询问女巫是否使用解药。`witchUsePoison` 函数用于女巫使用毒药,使用前会检查毒药是否已使用以及目标是否有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值