1.7 烧脑的警犬辨毒问题
刑侦组在搜查一伙毒贩的窝点时发现了7瓶无色无味的液体,外表完全一样,但其中一瓶是毒药。刑警只带了3只警犬,需要通过警犬尝毒的方法找出哪瓶是毒药。已知警犬喝过毒药两小时后就会死亡,然而由于案情紧急,刑警们必须在两小时后找出这瓶毒药侦察才能继续下去。请问如何在两小时后确定哪瓶是毒药。
难度:★★★★
有的读者可能会不假思索地给出答案:一条警犬就够了!让警犬一瓶一瓶地尝试,每尝一瓶液体就等两小时,总能知道哪瓶是毒药。但是这样做时间就不够了,刑警必须在两小时后找出毒药,而警犬服毒后两小时才会死亡,所以一瓶一瓶地尝试时间上肯定来不及。我们必须利用有限的资源找到一种快速辨别毒药的方法。
因为总共只有3只警犬,但是共有7瓶液体,所以如果让一只警犬仅仅尝试一个瓶子中的液体,则一次最多只能尝试3瓶。然而谁也不能保证尝试的3瓶液体中一定有那瓶毒药,所以让一只警犬每次仅尝试一瓶液体的方法依然不能保证在两小时后找出那瓶毒药。
于是我们自然会想到:每只警犬仅尝试一瓶液体是不够的,需要同时尝试多瓶液体才有可能在规定的时间内找到毒药。然而新的问题又来了,如果一只警犬同时喝下了多瓶液体并且在两小时后死亡,那如何辨别该警犬喝下的哪瓶液体是毒药呢?
所以我们又会想到:同一瓶液体必须让不同的警犬都有尝试,并且这种尝试方式是唯一的。这样当警犬死亡时就可以通过液体和警犬之间的对应关系确定哪瓶是毒药了。
基于以上思考,我们可以这样解决“警犬辨毒”问题。
因为总共有3只警犬,如果给每只警犬分别编号并规定每只警犬仅有“喝下液体”和“不喝液体”这两种状态,则3只警犬一共可以组成8种状态。如图1-32所示。
•图1-32 3只警犬组成的8种状态
除去第一种状态(每只警犬都不喝液体)外,余下共有7种状态。此时再给7瓶液体分别贴上1~7号的标签,让这7种状态分别对应1~7号瓶的液体。如图1-33所示。
这里规定警犬只按照对应的状态尝试液体,例如第一种状态是(1 号:不喝;2号:不喝;3号:喝),此时就让编号为3的警犬喝1号瓶的液体,其他两只警犬都不喝;再例如第五种状态是(1号:喝;2号:不喝;3号:喝),此时就让编号为1和3的警犬也喝5号瓶的液体,而2号警犬不喝。不难想象,当某一瓶液体有毒时,对应的状态中喝掉液体的警犬就会在两小时后死亡。假如6号瓶液体有毒,而6号瓶对应的状态是(1号:喝;2号:喝;3号:不喝),所以1号和2号警犬必然会在两小时后死亡,3号警犬肯定不会死亡。通过这种方法就可以确保在两小时后找出哪瓶液体是毒药。
•图1-33 警犬喝液体的7种状态对应1~7号瓶的液体
其实在实际操作中没有必要按照图1-33所示的7种状态依次让对应的警犬尝试对应编号的液体,我们只需要将每种“喝液体”状态对应编号的液体混合起来,再分别将混合后的液体给对应的警犬尝试即可。具体来说,可将编号为4、5、6、7的液体混合起来给1号警犬喝掉;将2、3、6、7号液体混合起来给2号警犬喝掉,将1、3、5、7号液体混合起来给3号警犬喝掉,这样就可以在两小时后根据死亡的警犬确定哪瓶液体有毒了。
在上面这个实例中,我们通过3只警犬可以组合出8种尝试液体状态的特性解决了这个辨毒的问题。其实这里用到了“二进制数”的思想。对于每一只警犬,它的“喝液体”和“不喝液体”构成了两种状态,对应到二进制数中就相当于二进制的0和1。一个3位的二进制数总共可以组合成8种状态(000~111),分别对应了十进制数中的0~7,其中的1~7恰好可以对应到编号为1~7的液体上,于是就可以巧妙地解决这个问题,如图1-34所示。
•图1-34 二进制数的对应关系
知识延拓——十进制与二进制
我们日常生活中的计数都是采用十进制计数法的,在十进制计数法中只能用0、1、2、3、4、5、6、7、8、9这10个数字表示一个数,一个数中不同的数位表示的含义也不同。例如,一个十进制数12345,共有5个数位,每个数各自的含义如图1-35所示。
•图1-35 十进制数中每个数位的含义
因此十进制数字12345的含义就是:该数中包含1个10000、2个1000、3个100、4个10和5个1,即
12345=1×104+2×103+3×102+4×101+5×100
所以用十进制计数法表示一个数时,该数的数值就等于每个位上的数字乘以该位对应的权值之和。
十进制计数法自古有之,我们前面讲过中国古代采用算筹计数,而算筹计数就是采用十进制计数法。另外在出土的古埃及和古印度的文物中也都有使用十进制计数的记载。其实也有特例,巴比伦文明的楔形数字采用的是六十进制计数,而玛雅数字则是二十进制计数,但大多数文明还是采用的十进制计数法。之所以大家都习惯于使用十进制计数可能跟人类有十根手指有关。古希腊哲学家亚里士多德曾说:“人类普遍使用十进制,只不过是绝大多数人生来就有十根手指这样一个解剖学事实的结果”。
虽然十进制计数法很符合人类的使用习惯,但是并不适合计算机使用。众所周知,计算机的核心部件是中央处理器(CPU),而构成计算机CPU的主要电子元件是二极管,二极管具有单向导通的特性,也就是说,二极管只有“通电”和“不通电”这两个状态。人们把这两种状态抽象成数字1和0,1表示通电,0表示不通电。而十进制中共有0~9这10个数字,也就是对应了10个状态,所以计算机处理起来很不方便,因此使用二进制码作为计算机处理的数据就成为必然的选择。
我们可以通过类比十进制计数法来理解二进制计数法。在二进制计数法中只能用0和1这两个数字表示一个数。在一个数中不同的数位表示的含义也不相同。例如一个二进制数11001,共有5位,其含义如图1-36所示。
•图1-36 二进制数中每个数位的含义
因此二进制数11001的含义就是:该数中包含1个24、1个23、0个22、0个21和1个20即
11001=1×24+1×23+0×22+0×21+1×20=25
不难看出,二进制数跟我们熟悉的十进制数很类似,只是每个数位代表的含义不同,对于十进制数,它的第i位( i从0开始,从右至左)表示10i;对于二进制数,它的第i位( i从0开始,从右至左)则表示2i。