1 条题解
-
0
题意简述
有 6 个角色 (A–F)、6 个武器 (G–L)、9 个房间 (M–U)。
游戏开始时,从角色、武器、房间中各移除一张卡片(凶手、凶器、作案地点)。
剩下的 18 张卡片发给 4 个玩家,玩家 1 先手。
玩家 1 知道自己的 5 张卡片。
有若干条提议记录:提议者说出一个角色、一个武器、一个房间,然后从右边玩家开始,第一个能反驳的人展示一张相关卡片(如果有多张可任选),只有提议者和反驳者知道具体是哪张卡片,其他人只知道有反驳但不知道具体卡片(用 * 表示)。
目标:根据已知信息和提议记录,推断出被移除的三张卡片(凶手、凶器、地点)。
关键逻辑
已知信息
玩家 1 知道自己的 5 张卡片。
被移除的三张卡片一定不在任何玩家手中。
如果某张卡片在玩家 1 手中,它就不可能是被移除的卡片。
提议与反驳的逻辑
如果某个玩家对提议做出了反驳(非 -),则他至少拥有提议中的一张卡片。
如果反驳卡片对玩家 1 可见(即玩家 1 是提议者或反驳者),则玩家 1 知道具体是哪张卡片。
如果不可见(用 * 表示),玩家 1 只知道反驳者拥有提议中的某一张,但不知道具体是哪张。
排除法
如果某张卡片出现在玩家 1 手中,它一定不是被移除的卡片。
如果某张卡片在某个提议中被展示(对玩家 1 可见),则它一定在某个玩家手中,不是被移除的。
如果某个提议无人反驳,则提议中的三张卡片不可能都在玩家手中,即至少有一张是被移除的(因为如果都在玩家手中,则一定有人能反驳)。
算法步骤
初始化三个集合:
possible_suspects = {A..F}
possible_weapons = {G..L}
possible_rooms = {M..U}
从玩家 1 的手牌中移除对应的卡片。
对于每条提议记录 (sus, wea, room, resp1, resp2, resp3):
如果某个响应是具体卡片(不是 - 或 *),则这张卡片一定在某个玩家手中,从对应可能的移除集合中移除。
如果所有响应都是 -(无人反驳),则 sus, wea, room 中至少有一张是被移除的,但我们不能确定是哪张,所以不能直接移除,但可以记录这个约束。
如果某个响应是 *(不可见反驳),则反驳者拥有 sus, wea, room 中的至少一张,但我们不知道是哪张,所以不能直接移除。
利用“无人反驳”的约束: 如果某张卡片在所有“无人反驳”的提议中都不在提议的三张卡片中,那么它一定不是被移除的(因为如果它是被移除的,那么包含它的提议就会无人反驳,但它不在那些提议中,矛盾)。 更简单的处理:对每个“无人反驳”的提议,我们记录 {sus, wea, room} 中至少有一个是真的被移除的。我们可以尝试枚举所有可能性,但这里数据量小,可以用约束传播。
更直接的方法: 我们维护每个卡片是否“一定在玩家手中”(in_hand)。
初始:玩家 1 的手牌 in_hand = True。
对于可见的反驳卡片,in_hand = True。
对于无人反驳的提议,sus, wea, room 不能全部 in_hand = True(否则会有人反驳),所以如果其中两张已知在玩家手中,则第三张一定被移除。
重复应用规则,直到没有变化。
样例 1 分析
输入:
text 1 B I P C F A G M - - - 玩家 1 手牌:B, I, P 提议:C, F, A, G, M,响应:- - -(无人反驳)
无人反驳 ⇒ {C, F, A, G, M} 中至少一张是被移除的。
但玩家 1 手牌不含这些,所以无法直接确定。
但注意:被移除的三张卡片分别来自角色、武器、房间,所以:
可能的凶手在 {C, F, A} 中(因为无人反驳,且其他角色不在提议中,所以如果凶手是其他角色,则这个提议会有人反驳?这里要小心) 实际上,更精确:如果凶手不在 {C, F, A} 中,那么凶手卡片在某个玩家手中,那么当提议包含凶手时,该玩家可以反驳,但这里无人反驳,所以凶手一定在 {C, F, A} 中。同理,凶器在 {G, M} 中,房间在另一个集合?不对,这里 G 和 M 都是武器吗?检查:G–L 是武器,M–U 是房间,所以这里 G 是武器,M 是房间。 所以:
凶手 ∈ {C, F, A}
凶器 ∈ {G}
房间 ∈ {M} 但玩家 1 不知道具体是哪张,不过题目输出是 AGM,说明样例 1 可能还有额外推理: 实际上,因为只有一次提议且无人反驳,所以被移除的三张卡片就是提议的三张?不对,提议是 5 张卡片?等等,输入格式是“三张卡片”表示角色、武器、房间,所以是 C(角色), F(角色?), 不对,看样例:C F A G M 这是 5 张卡?但题目说“每行以三张卡片开始,依次表示提议的角色、武器和房间”,所以应该是 C F A 是角色?但角色只有 A–F,这里 C F A 都是角色?这不可能,一个提议只能有一个角色。我怀疑样例输入格式是: 第一张是角色,第二张是武器,第三张是房间,后面是响应。 所以 C F A G M 怎么解释?可能我理解错了,重新看:
样例 1 输入:
text 1 B I P C F A G M - - - 意思是:
玩家 1 手牌: B, I, P
提议: 角色=C, 武器=F, 房间=A? 但 A 是角色,房间是 M–U,所以不对。 看来是:角色=C, 武器=G, 房间=M,那么 C F A G M 中的 F A 是什么? 仔细看题目:“接下来给出剩下三个玩家的响应”,所以 C F A G M 中 C 是角色,F 是武器?但武器是 G–L,F 是角色,所以矛盾。
我怀疑数据格式是:每行前三个是角色、武器、房间,后面三个是三个玩家的响应。 所以样例 1: C F A G M - - - 表示:
角色=C, 武器=F, 房间=A
响应1=G, 响应2=M, 响应3=- 但 G 和 M 是卡片,表示这些玩家展示了这些卡片作为证据。 所以:
玩家 2 展示了 G(武器)
玩家 3 展示了 M(房间)
玩家 4 无证据
因此 G 和 M 在玩家手中,不可能是被移除的。 角色 C 和 F 和 A 中,A 是角色,但这里 A 是房间?混乱。
为了不陷入格式泥潭,我们直接实现逻辑:
实现方法
标记玩家 1 的手牌为 owned。
对于每个提议 (sus, wea, room, r1, r2, r3):
如果 r1/r2/r3 是具体卡片,则标记 owned。
如果全部是 -,则记录约束:{sus, wea, room} 中至少一个不在任何玩家手中(即被移除)。
用约束传播:
如果某个卡片在 owned 中,则它不可能是被移除的。
对于每个“无人反驳”的提议,如果其中两个卡片已知在玩家手中,则第三个一定被移除。
如果某个卡片在所有“无人反驳”提议中都不出现,则它一定在玩家手中(因为如果被移除,则包含它的提议会无人反驳)。
最后,对于角色/武器/房间,如果只剩一个可能,则输出它,否则输出 ?。
总结
核心是逻辑推理和约束传播。
利用“无人反驳”提议得出“至少一张被移除”的条件。
利用可见反驳确定卡片在玩家手中。
输出时按角色、武器、房间顺序。
- 1
信息
- ID
- 5370
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者