自学内容网 自学内容网

LuoguP2482 [SDOI2010] 猪国杀 题解 大型模拟题

题目链接:LuoguP2482 [SDOI2010] 猪国杀
题目描述:

一群猪玩猪国杀(类似三国杀),按照特定的规则出牌,问谁能获胜,输出获胜时,存活的猪的手牌。

题解:

给出几个需要注意的点,可以检查自己的代码是否考虑到:

  • 无懈可击只能对表明身份的角色使用;
  • 桃只能对自己使用;
  • 主公身份开场向所有人表明,这表明一开始主公可以给自己用无懈可击;
  • 非主公在一开始均未表明身份,这代表着一开始除主公外的所有人都不能对自己使用无懈可击;
  • 由于只存在一把武器,且其攻击距离为1,故杀只能打到自己范围内距离为1的敌人;
  • 计算攻击距离始终按照逆时针的方向计算,而不会是顺时针与逆时针攻击距离的最小值;
  • 使用的牌全部是能用的牌中最靠近左侧的那一张;
  • 忠臣只会杀或决斗反贼,反贼的决斗一定是对主公使用,反贼的杀只会对主公或者忠臣使用,但是会优先对主公使用,只有当距离不够时,反贼才回对忠臣使用杀;
  • 当满足游戏结束的条件时,立即结束,这表示当游戏结束时,如果群体锦囊未完全判定完成会立刻结束后续判定、最后一个反贼死亡时伤害来源不会进行摸牌;
  • 打出杀、决斗、使用无懈可击均会表明身份;身份一旦表明,后续的任何操作都不会改变其身份;
  • 群体锦囊对主公造成伤害,伤害来源在主公行动时还未表明身份,主公会将伤害来源作为杀或者决斗的目标,并且其优先级与反贼相同;
  • 决斗的过程中,忠臣一定不会向主公出杀;其余情况下所有角色只要有杀均会打出;
  • 决斗可能会把自己杀死,这种情况下应该停止继续出牌,由下一名活着的玩家进行;
  • 当任意一起角色血量降为0时,立即轮到该角色行动,并尝试打出一张桃,若不能打出,则该角色阵亡。
  • 任意一名角色的死亡均有可能导致游戏结束;
  • 主公杀死忠诚需要扔掉所有的牌,包括武器牌;
  • 由于数据的问题,牌堆的最后一张牌是无限张。

注意到上面的点之后,我们便可以开始做题了。
这个简单说一下自己的做法:

  • 将角色和卡牌抽象成类;
  • 对于角色而言主要需要记录其基本信息、手牌和对其他角色的身份看法;
  • 对于卡牌而言主要需要记录其卡牌类型,所属角色,作用目标角色;
  • 抽象每个角色的行为:回合开始、摸牌、尝试出牌、濒死时尝试打出桃、尝试打出无懈可击、等待所有要出的无懈可击出完、打出群体锦囊、杀死人后尝试摸牌或扔牌;
  • 全局函数更新各个角色之间的态度(ij同阵营、敌对阵营、未知、可能敌对阵营,其中可能敌对阵营只会出现主公对某个角色),当部分角色的态度改变时,可以通过Floyd算法更新出关系。

按照上面的思路实现,或者按照自己的思路实现,在实现的过程中注意提到的细节即可。
当你发现如论如何也想不知道遗漏了什么之后,你可以将题解代码中的输出注释删除,其运行后会输出每一名角色进行的操作以及操作后的角色状态。

代码连接:LuoguP2482


原文地址:https://blog.csdn.net/qq_45523675/article/details/136380103

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!