原文地址:100个囚犯开关问题有bug
作者:小阳
想了许久,没有想出答案,后来网上搜了下答案,豁然开朗,貌似是百度的面试题,给出的答案是这样的:
方案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确保计数的人是第一个被放风的人。