INKWIRE(7) reasoning puzzles INKWIRE(7)
poisoned-wine
一千瓶酒
十名囚犯,二十四小时,一瓶毒酒。
名称
题目
一场宴会需要 1000 瓶酒。其中恰好有一瓶被下了毒。毒药是无声的:在致命的一口之前没有任何症状,而且必定在摄入后整整 24 小时发作致死。
你有十名愿意参与的囚犯,以及一个 24 小时的窗口。没有人可以被喂第二次,也没有时间做第二轮测试。你必须确定地找出那瓶毒酒。
最直白的方案要用 999 名囚犯,违反约束。可行方案只用十名,它能成立,是因为答案不必靠「一个人一个人地读」来获得。
信号
条件与每个条件所强制的结论
| # | 条件 | 它强制了什么 |
|---|---|---|
| 1 | 1000 瓶中恰好一瓶有毒 | 答案是一个 1..1000 的下标,需要 10 个比特来编码(2^10 = 1024 ≥ 1000) |
| 2 | 毒药在摄入后恰好 24 小时致死 | 所有试喝必须在同一时刻完成;窗口内不可能安排轮次先后 |
| 3 | 可动用十名囚犯 | 十个独立的「是/否」结果给出 2^10 = 1024 种可区分图案,刚好够用 |
| 4 | 一名囚犯可以喝很多瓶 | 允许混合,所以一名囚犯可以代表瓶子编号的一个比特:该位为 1 的每一瓶他都喝一口 |
| 5 | 死亡是明确的,且在 24 小时这个时点被观察到 | 死亡者的集合直接用二进制拼出编号,不需要进一步推断 |
例子
解题法
给每位试喝者一个比特。谁死谁活的集合不是需要解读的线索——它就是答案本身,用十名囚犯唯一能提供的字母表写成的答案。
[+] 完整解法 4
把瓶子编号为 0 到 999,用十位二进制写出每个编号。第 237 号瓶是 0011101101。
为每个比特位指派一名囚犯。囚犯 1 管 512 位,囚犯 2 管 256 位,依此类推到囚犯 10 管 1 位。对每一瓶酒,凡是在该瓶编号中对应比特为 1 的囚犯,都从这瓶喝一口。第 237 号瓶会交给囚犯 3、4、5、7、8、10。
等待 24 小时。把死亡情况读成一个二进制数:死的囚犯记 1,活的记 0。如果囚犯 3、4、5、7、8、10 死亡而其余存活,图案就是 0011101101,毒酒是第 237 号。
这个方案是精确的,因为「瓶子编号到死亡图案」的映射就是二进制表示本身,每一瓶都产生独一无二的图案。它只用到 1024 个图案中的 1000 个,所以编号 1000 到 1023 根本不会被用到。
近亲条目
- [P] twelve-coin 有一枚假币,但不知道它偏重还是偏轻。
- [P] bridge-and-torch 四个人,一支火把,十七分钟。
- 目录 — /zh/t/puzzle/
[+] 补充与常见疑问 3
- 为什么恰好是十个人而不是九个?
- 九个人只有 2^9 = 512 种图案,少于 1000 瓶。十个人给出 1024 种,覆盖范围之外还剩 24 个空位。囚犯的人数就是所需的二进制位数。
- 如果有两瓶被下毒呢?
- 二进制方案会失效,因为死亡图案会变成两个编号的按位或,无法拆分。这时需要另一套编码——存在若干纠错码或组合设计方案,但它们都需要更多囚犯或更多轮次。
- 喝得越多死得越快吗?
- 本题假定剂量不影响时间。若毒药有时间-剂量效应,方案依然成立,因为每位试喝者平均喝下的口数相同,而时点仍然是同一个 24 小时。
适用范围 — 本题用于推理练习;上面的编码是信息上限的经典示例。