邪恶而心思缜密的典狱长最近心血来潮,于是召集了100个囚犯。望着眼前的囚徒,他的嘴角弯起了一个得意的弧度:
“宣布一个好消息,大家有机会获释了。”
“我们一起做个轻松愉快游戏,赢的人可以立即走出这里。"
"说下游戏规则吧。游戏开始后,我会把你们随机排成一列。然后给每个人背上贴一张纸条,黑色或者白色。规矩是,后面的人能看到前面人的颜色,但是前面的人不能回头看后面的人,更不能看自己的纸条。一旦发现违规,——全部处死。游戏开始以后,每个人从后往前依次报出自己的颜色。当让了,前面的人能听到后面的人说了什么。如果说对了,给你自由;说错的话,处死!”
底下人潮涌动。
欣赏着各色表情,狱长先生继续说:"呵呵,刚才与诸位开个玩笑。只不过,猜错的某位,要劳烦在这里多待一个寒暑罢了。”
随即,目光下沉:“但要记住,只能报‘黑’或‘白’。多说一个字,立即处死。"
“明早,这里集合;9点钟,游戏开始。先生们,能获得多少自由,就看你们自己的了,不要让我失望哦。”
那么问题来了,这群囚犯应该商量一个什么样的对策,才能让自己获释的机会最大呢?
如果每个人随机回答自己的颜色,所有的人只有五成的机会。
如果后面的人报出前面一个人的颜色作为提示。前面一个人可以确保自由,后面的人仍然只有一半的机会。总体上有75%的机会。
是否还有更好的方法呢?
这个方法是存在的,而且好到可以让前面的99个人自由,后面的一个人有一半的机会自由,总体上达到99.5%的成功率。
那么这个策略是什么样的呢?
看下已知量是什么:
1)每个人可以看到前面的人,也可以听到后面的人。如果后面的人报的颜色是正确的话(最后一个人除外),他可以知道:除了他以外,其他人的帽子颜色。
2)游戏开始以后,所有人的帽子颜色值是一定的。这是一个不变量。
黑色用1表示,白色用0表示。
最后一个人可以看到前面99个人有多少个1(黑色)。如果是奇数个,他就报1(黑色),如果是偶数个,就报0(白色)。
前面的听到最后一个人的暗示以后,就知道自己这99个人当中黑白的奇偶j;当然他也知道其他人帽子颜色。所以就可以推测出自己的颜色。
举个例子:
6个人从前往后帽子颜色是:
0 1 0 1 1
0
最后一个人看到有3个1,于是就报1,发出暗示。当然他也就牺牲小我,成就大我。
第5个人看到前面有2个1,于是知道自己也是1,就报1(黑色)。
第4个人听到第5个人是黑色,也看到前面3个人有1个黑色,加起来是2个黑色,所以自己必然是黑色。
第3个人可以知道前5个人中,除了自己有3个黑色,于是知道自己是白色
依次类推,前5个人都可以准确猜出自己的颜色。
如果是100个人,依此进行。
把这个问题进行抽象,我们实际上要对前99个值做一个运算,得到的值{0,1}作为最后一个人的暗号
这个运算函数是F, F(B1, B2, ...,B99)的值就是B100
最后每个人i可以通过B100,以及{Bk, k不等于i}这个集合,做F的逆运算,然后得到自己的值。
我们的目标就是找到这个函数F
最后我们找到的这个函数F就是:计算集合{Bi, 1<=i<=99}中1的奇偶性。奇数用1表示,偶数用0表示。
用计算机当中的位运算来说说,这是一个异或函数。