题目一:
你的面前有30个硬币,其中有10个正面朝上,20个反面朝上,混乱在一团。
要求:现在用厚布遮住你的眼睛。要你把30个硬币分成2团,每团正面朝上的硬币个数相等。问:你要怎么分?不能用手去触摸感觉,也没有其他人帮忙。
题目二:
有4枚硬币,初始状态未知。你的眼睛被蒙住,看不到硬币的状态,但可以随便翻任何几个硬币。你每翻一次以后,如果4枚硬币的状态是全正面朝上或者全背面朝上,旁边的人会告诉你翻成功了。现在问你,最少翻几次可以保证成功?每次翻哪几枚?(百度2008年面试题)
我们用4位二进制数表示硬币的状态。由于最终的结果只要4枚硬币状态一样就行,正面还是背面没有关系,因此0000或1111都可以成功。由此又可以推出任何两个互为反码的状态是等价的,比如1001和0110,对于我们的目标来讲没有区别。因此也不必关心0和1代表的是正面还是背面,只要知道他们的位置关系就可以。
用X和O来表示翻硬币的方法。X表示把相应位置的硬币翻过来,O表示保持不动。同样的,互为补码的翻法是等价的,比如XXOO和OOXX对结果没有区别。
下面我们看看任一时刻,4枚硬币的状态一共有几种:
0001
0010
0100
1000
1100
1010
1001
除了成功状态以外,一共就只有这7种状态,其他的所有状态都和这7种中的某一种等价。同样的可以知道,翻法也只有7种。现在我们再取4枚硬币,把它们叫做演示硬币(相应的,原来的那4枚称作原始硬币),让演示硬币的初始状态为0000。我们每一次对原始硬币使用了什么翻法,就对演示硬币执行同样的操作。举个例子:如果原始硬币的初始状态为0010,第一次翻的时候用OOXO的翻法,那么翻过一次以后,原始硬币状态变成0000,演示硬币变成0010。
可以看到,在任一时刻,当且仅当演示硬币的状态和原始硬币的初始状态相同时,翻成功。而原始硬币一共有7种初始状态。因此,要保证成功,就必须使演示硬币能呈现出所有7种状态,这样才能保证原始硬币无论具有哪种初始状态都一定会在某一步成功。故最少需要7步。翻法如下:
步骤 | 翻法 | 翻过以后演示硬币的状态 |
第1步 | OOOX</ |