今天介绍一个有趣的数学谜题。
题目是这样的:有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是无色无味的毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里装的是毒药呢?
乍一看,这根本就是无解的,1000个瓶子,8只老鼠挨个喝是喝不过来的,所以直觉上,这是一道无解的谜题。
那么,答案是什么呢?
首先,让我们转变一下思路:
10只老鼠,有几种死法?
让我换一种说法:10只老鼠,每只老鼠都有生或死两种状态,能生出多少种变化/组合方式?
答案是 2^8=1024 种
这意味着,10只老鼠的生死状态可以有1024种不重样的组合方式,而1000个瓶子中藏着一瓶毒水,能产生的变化至多只有1000种,只要毒水位置的1000种可能能够分别对应老鼠的死亡组合方式,那么,我们就可以通过观察老鼠的死亡方式逆推毒水瓶的位置!
我们先用二进制表示老鼠的死亡组合:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
……
由于8位二进制数有1024个,因此可以不重样的写出1024个组合。组合中,0表示不死,1则表示死亡。每一个组合都是独一无二的,组合与组合之间至少在八个位中存在一位的不同。
然后,如何创造出对应的死亡组合呢?
很简单,死亡的老鼠就是喝了毒水的。
所以,编码中的0也能解读为没喝,1也能解读为喝了。
这样,一个编码解码的对应关系就出现了:1024个二进制数字依次对应1000个瓶子,二进制的八个位分别对应八只老鼠,八只老鼠按照前1000个数字上的0&1指示去喝1000个瓶子里的水,老鼠最终的死亡组合只有一个,这就对应着他们喝水的组合,而这组合呈现的二进制编码所对应的瓶子,就是装着毒水的那个。
完~