二进制思维:10 只老鼠如何找到 1000 瓶中的毒药?
一句话结论(30s)
结论先行:10 只老鼠能在 1 周内从 1000 瓶里找出毒药,因为每只老鼠的”死/活”是一个二进制位,10 位可编码 2¹⁰=1024 种状态 > 1000。本质是二进制编码——用 N 个二态单元表示 2^N 种状态,让信息压缩比最大化,毒药白鼠、分金块、Nim 游戏三题同构。
核心原理(2min)
毒药白鼠:把 1000 瓶编号转 10 位二进制,第 i 只老鼠喝所有第 i 位为 1 的瓶子,一周后按死亡老鼠还原毒药编号——每只老鼠是”二进制探针”。分金块:切 1/7、2/7、4/7 三份(二进制权重 1、2、4),可组合出 1~7 所有整数。Nim 游戏:所有堆异或 XOR=0 则先手必败,否则先手必胜,因为非平衡态总存在一手使 XOR 归零,XOR 是复杂博弈的简洁表征。三者都靠”信息空间大小决定策略可行性”这一共性。
底层深入(5-10min)
毒药白鼠:二进制编码
1000 瓶液体中 1 瓶是毒药(饮用后一周内死亡),有 10 只老鼠,1 周时间,找到毒药瓶。
直觉失败:1000 瓶 → 老鼠死/活是二态 → 10 只老鼠能编码 $2^{10} = 1024$ 种状态 > 1000 → 够了。
做法:
- 将 1000 瓶编号 1~1000,转为 10 位二进制
- 第 $i$ 只老鼠喝所有第 $i$ 位是 1 的瓶子
- 一周后,死亡老鼠对应位为 1,存活对应位为 0 → 还原出毒药瓶编号
例如: 死亡老鼠 = [0, 2, 5, 7] → 二进制某位被这些老鼠覆盖 = 毒药编号的第0,2,5,7位是1
本质:每只老鼠是一个”二进制探针”,用它们的生死状态编码 10 bit 信息,覆盖 1024 种可能性。
💭 思考:为什么第 i 只老鼠要喝”所有第 i 位为 1”的瓶子?——因为这样每只老鼠的生死就独立地”探测”编号的一位,一周后把死亡老鼠对应的位拼起来,就是毒药瓶的编号,一次并行实验完成全部探测。
分金块:二进制的”支付码”
7 天付工资,只能切 2 刀,每天恰好支付当天的份额。
切三份:$\frac{1}{7}$、$\frac{2}{7}$、$\frac{4}{7}$(二进制权重 1、2、4)。这三份可以组合出 1~7 的所有整数:
1 = 1/7
2 = 2/7
3 = 1/7 + 2/7
4 = 4/7
5 = 1/7 + 4/7
6 = 2/7 + 4/7
7 = 1/7 + 2/7 + 4/7
扩展:发 15 天工资,切三刀分四份 $\frac{1}{15}, \frac{2}{15}, \frac{4}{15}, \frac{8}{15}$ ——二进制覆盖 1~15。
💭 思考:为什么切 1/7、2/7、4/7,而不是平均切三份?——因为 1、2、4 是二进制权重,任取其一或多个相加能恰好凑出 1~7 的每一个整数;平均三份的粒度是 7/3,凑不出 1/7、2/7 这种细分,无法每天精确支付。
Nim 游戏:异或的魔法
N 堆石子,每次从任意一堆取任意数量,取最后石子者胜。
Sprague-Grundy 定理:计算所有堆的 XOR:
- XOR = 0 → 平衡态 → 先手必败(无论先手怎么拿,后手总能让 XOR 重新归零)
- XOR ≠ 0 → 非平衡态 → 先手必胜(先手存在一种拿法使 XOR 归零)
boolean canWin(int[] piles) {
int xor = 0;
for (int p : piles) xor ^= p;
return xor != 0;
}
XOR 的深刻之处在于:每堆石子数量是关键,但只需一个异或运算就能判断全局胜负——复杂博弈的简单表征。
💭 思考:为什么 XOR=0 就必败?——因为平衡态下无论从哪堆取走多少,XOR 都会变为非 0,后手总能再取一次把它调回 0;而终局(全 0)也是 XOR=0,所以先手面对 XOR=0 只能把平衡让给后手,最终由后手拿走最后石子。
总结
二进制编码在智力题中的应用极为深刻:用 N 个二态单元(bit/老鼠/砝码/箱子)表示 $2^N$ 种状态,信息压缩比最大化。三题同构——信息空间大小决定了解决策略的可行性。
章末提问
追问 1:如果只有 8 只老鼠,最多能检测多少瓶?
回答思路:结论是最多 256 瓶,因为 8 只老鼠的生死状态只能编码 2^8=256 种不同模式,信息空间大小决定了可区分瓶数的上限。
追问 2:为什么第 i 只老鼠要喝”第 i 位为 1”的所有瓶子?
回答思路:结论是这样能把每只老鼠的生死独立映射到编号的一位——第 i 只老鼠死说明毒药编号第 i 位是 1,一周后把死亡老鼠的位拼起来即还原编号,一次并行实验完成全部探测。
追问 3:Nim 游戏为什么 XOR=0 时先手必败?
回答思路:结论是 XOR=0 是平衡态,任何一步取子都会破坏平衡(XOR 变非 0),后手总能找到一步把它调回 0;由于终局全 0 也是 XOR=0,先手永远只能把平衡让给后手,最终由后手拿走最后石子。