100个囚犯开关问题有bug

原文地址:100个囚犯开关问题有bug 作者:小阳
      昨天,在网上看到这样一道有意思的题:   
      10月16日腾讯笔试题。
      国王招来100个囚犯,对他们说:你们犯的是死罪,但我给你们一次求生的机会。15分钟以后,你们将被关进一个有100间隔离牢房的监狱里,每人一间牢房,都与外界隔绝,什么也听不见看不到,连时间都没法计算,无法获得外界的任何信息。 
        这所监狱有一个院子,每天至少随机(注意是完全随机)打开一间牢房的门,让一个囚犯到院子里来放风。院子里有一盏灯,放风的囚犯可以控制它的开关,将它打开或是关闭。除囚犯之外,其他人都不会去碰开关。这盏灯会永远有充足的能源供应,灯泡和电路不会出故障。
      除了开关这盏灯,放风的囚犯放风时留下的任何其它痕迹都会在夜晚被清除干净(包括在灯上作的任何记号)。牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风到院子里的人才能看到。 
      好了,现在我向你们提出一个要求,只要你们做到了,就可以全部获得释放: 
      给你们15分钟商量你们的方案。15分钟以后,你们将被关进我刚才说的那个监狱,永远无法再交流,被关若干天后,你们中间如果任何一个人能够向我证明你们每个人都至少放风了一次,我就把你们放了,不然永远别想再出来。 
      好吧!这样吧,如果你们有谁现在可以告诉我这个方法,也就是能够证明你们每人至少放风一次的方法,我马上放掉你们! 
      其中一个囚犯想了几分钟,回答了这个问题,国王听后,如自己所说的把他们全部给放了。请问那个囚犯是用什么方法证明的?
    想了许久,没有想出答案,后来网上搜了下答案,豁然开朗,貌似是百度的面试题,给出的答案是这样的:
    方案1:从这100人中选出1个人,这个人只能关灯,并且他记下自己关灯的次数。其他99人出来放风的时候只能开灯,并且每人只能开一次灯(也就是说,如 果他以前已经开过灯了,就算他再次出来的时候灯是关着的也不能开)。当关灯的发现他已经关灯99次时,就可以宣称所有人都出来过了。
    初一看,答案无懈可击,没问题。仔细一想,怎么想怎么觉着不对劲,首先,“牢房是完全封闭的,院子里的灯光在牢房里看不到。只有放风到院子里的人才能看到。”这个条件确保了放风的人不知道自己之前有没有人被放风过。再次,开关的初始状态,题目中并没有说到!这点很关键,因为如果开关原本就是开着的,假设负责关灯的人为Q, 并且Q很悲催,是第一个放风的人,他给关上就给记录了1次!这样导致当他记录到99次的时候,他认为另外99个人都已经被放风过,其实除他之外,只有98个人出来过,剩下的一个人从未被放风过,此时他如果说所有人都被放风过至少一次,就死定了。如果你说,那记录100次再说好啦,这样开关初始开着,Q是不是第一个进去的,都能记录到100次,但是存在下面一种情况:假设开关默认是关着的,Q不是第一个被放风的,另外一个人第一次去给打开了,然后Q进去给关上了记录一次,剩下98个人再给打开,Q再关上,记录98次,总共是99次,此时开关为关闭状态,并且所有人都已经被放风过了,Q等到死,也不会再看到打开的开关,即永远记录不到100次!!结论就是,在开关初始状态不知道的情况下,Q如果不是第一个被放风的人,那Q的判断就可能会有错误。除非这道题目再加上以下两个限定条件之一:1告诉开关的初始状态2确保计数的人是第一个被放风的人。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值