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

本文详细描述了猪国杀游戏的规则,并提供了编程策略,包括角色和卡牌的抽象设计、角色行为逻辑、身份判定以及Floyd算法的应用,以帮助玩家理解和编写解题代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

题解:

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

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

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

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

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

代码连接:LuoguP2482

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值