一道有意思的算法题,了解一下,对扩张思路有帮助。
问题描述:
有100个一模一样的瓶子,其中99瓶中装的是普通的水,一瓶是毒药,水和毒药只能通过老鼠来分辨,喝下毒药的老鼠会在一个星期后死亡(刚好一个星期)。现在你有一个星期时间,请问至少需要多少只老鼠才能确定出哪个瓶子装的是毒药?
我本来想的是用坐标的方式来确定哪一瓶是毒药:
1、摆成2x50,4x25,5x20,10x10的方阵
2、每行都放一只老鼠,然后让老鼠把这行水都喝一口
3、每列放一只老鼠,然后让老鼠把这列水都喝一口
4、一周后测试每一行和测试每一列的老鼠中都会有一只死亡,通过死亡的老鼠就可以判断毒药的坐标啦
5、需要的老鼠数量=方阵的长度+宽度
所以10x10的方阵最合适,需要老鼠20只
6、后来又想了想,为什么不建一个三维的坐标系呢,经计算4x5x5的坐标系最合适,所需老鼠=4+5+5=14只
最后看了其他解题方式之后,了解到这是一个二级制问题,用七只老鼠即可解决
这个解体思路,非常巧妙。
我们知道2的10次放等于1024,那么通过把瓶子编成二进制,同时把老鼠变成二进制的位值就可以分辨到底哪瓶水是毒药
1.利用二进制来做,最少的老鼠数量就是计算2的多少次方大于等于瓶子数量,例如本题为7(2的7次方为128,大于100)。对100瓶进行二进制编码,这样可以排列出1xxxxxx,x1xxxxxx,...,xxxxxx1这样的七组序列。如第一瓶药水编码为0000001,第五瓶药水编码为0000101,第一百瓶药水的编码是1100100.
2.把老鼠分辨编成1-10号,分别对应二进制的第1位,第2位.....第10位
3.根据每瓶水的二进制代码给老鼠喝水,该位值为1就给该位值的老鼠喝,为0就不喝,比如,第一瓶药水编号为0000000001,就只给1号老鼠喝,第84瓶,编号是1010100 ,就给3号,5号,7号老鼠喝
4.1星期后,看哪些老鼠死了,然后死的老鼠位为1,没死的老鼠位为0,组成二进制数,该数对应的瓶子编号就是有毒的编号。