您的位置:首页 > 职场人生

趣味算法:国王和100个囚犯(据说是腾讯的面试题)

2010-08-10 14:00 429 查看
国王招来100个囚犯,对他们说:你们犯的是死罪,但我给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见看不到,连时间都没法计算,无法获得外界的任何信息。
这所监狱有一个院子,每天只少随机(注意是完全随机)打开一间牢房的门,让一个囚犯到院子里来放风。院子里有一盏灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,灯泡和电路不会出故障。
除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风到院子里的人才能看到。

好了现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放:
给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流,被关若干天后,你们中间如果任何一个人能够向我证明你们每个人都至少放风了一次,我就把你们放了,不然永远别想再出来。
好吧!这样吧,如果你们有谁现在可以告诉我这个方法,也就是能够证明你们每人至少放风一次的方法,我马上放掉你们!

其中一个囚犯想了几分钟,回答了这个问题,国王听后,如自己所说的把他们全部给放了。请问那个囚犯是用什么方法证明的?

分析一下,这里面参与求解的东西无非就是监狱、灯、囚犯(计数员)。

监狱:没有什么动作需要做的。

灯:有一个状态标识, 提供开灯和关灯的方法。

囚犯:有一个是否开过灯的标识,并带有一个开灯的方法

计数员:继承囚犯,且拥有关灯的方法。

大致的解题思路(建议思考后再看):

代码

囚犯们指定一人为计数人(A),A以外的囚犯每次出来放风时,如果看到灯是关闭的,则将灯打开,但如果已经开过一次灯,则不理会,当A出来放风时,如果灯是开着的,则将灯关掉,关一次则表示有一个人出来了一次,计数至100,完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: