有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?
(提示:使用伟大的二进制)
(图中瓶子的分类和下面的方法分类有点出入,不过原理是一样的)
根据2^10=1024,所以10个老鼠可以确定1024个瓶子哪个有毒,因为我们对瓶子进行从0到M-1的排序(M表示瓶子的数量)
如果实验结果所有老鼠都不死,说明有毒的瓶子编号为0,即第0瓶
000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7
其中二进制的一位表示一个老鼠,0--7号表示瓶子的序号,
把1、3、5、7号瓶子混合起来给1号老鼠吃
把2、3、6、7号瓶子混合起来给2号老鼠吃
把4、5、6、7号瓶子混合起来给3号老鼠吃
哪个老鼠死了,相应位表示为1
如果老鼠1死了,老鼠2死了,老鼠3没死,
老鼠3表示最高位,则对应的二进制是:011,011的十进制为3,即3号瓶子有毒
同理,10个老鼠可以确定1000个瓶子。最大数说是可以确定1024个
下面是程序的实现思路:
1、输入N个瓶子,确定需要M个老鼠的算法
找出条件满足2的M-1次方小于N,2的M次方大于等于N的 M的值
2、找出1号、2号、3号、.......M号 老鼠要喝的混合瓶子,‘与运算’是按位与运算
所有的瓶子号数与 1“与运算”成立的结果,得出1号老鼠要喝的混合瓶子
所有的瓶子号数与 2“与运算”成立的结果,得出2号老鼠要喝的混合瓶子
所有的瓶子号数与 4“与运算”成立的结果,得出3号老鼠要喝的混合瓶子
.............
所有的瓶子号数与 2的(M-1)次方“与运算”成立的结果,得出M号老鼠要喝的混合瓶子
3、复合选项框的处理问题
选择1号老鼠提交的数值为1
选择2号老鼠提交的数值为10
选择3号老鼠提交的数值为100
选择4号老鼠提交的数值为1000
................
选择M号老鼠提交的数值为10的M-1次方
然后把所有老鼠提交数据的数值相加起来就能得到瓶子对应的二进制号码了
把二进制转换成十进制就得到对应的瓶子号数了
这是我写程序实现的页面,可以确定N个瓶子的解决方法:
点击这里
PS:为了防止程序死掉,程序最大可确定1025个瓶子,知道原理就好
这里是程序源码:
点击下载