有100 个被判无期的囚犯,被关在100个独立的小房间,互相无法通信。

每天会有一个囚犯被随机地(1/100)抽出来放风,每次抽取都是相互独立的。放风的地方有一盏灯,初始时关着,囚犯可以打开或者关上,除囚犯外,没有别人会去动这个灯。每个人除非出来防风,是看不到这个灯的。

一天,全体囚犯大会,国王大赦,给大家一个机会:如果某一天,某个囚犯能够明确表示,所有的囚犯都已经被放过风了,而且的确如此,那么所有囚犯释放;如果仍有囚犯未被放过风,那么所有的囚犯一起处死!
囚犯大会后给大家20分钟时间讨论,囚徒们能找到方法么?

这个问题好像没看到出题人的答案,但是最好的解法我觉得有如下两种:

1:假设一百个人中选出一个人a只有他可以关灯,其他99个人只能开一次灯,并且只有在灯关闭的情况下才能开灯,其他情况不作动作,即只有在a关过一次灯之后才能有没关过灯的人开灯,最后到了a关了99次之后才表示至少每个人都来过一次。这应该至少是一个np-hard 问题。这个解法最快囚犯也得99*2=198天才得出去,最晚。。。。无期。

2:二进制从零到一百:最后一位数变化了50次(0 1变化)

所以囚徒们要想确定一百个人都放过风应该预先约定:

(1) 每个人只能在第一次放风的时候改变一次灯的状态,以后决不动灯;

(2)每次放风回去以后纪录灯的状态(比如,灯亮为1,灯灭为零);

(3)连续放风不做记录

(4)相连的0或1只留一个:比如01000110001,简化为010101

一旦某日任意囚徒发现自己的纪录中0 1 交替变化了50次则表示可以出狱了

110010101

 

posted on 2009-09-07 11:07  sinbad_li  阅读(3085)  评论(0编辑  收藏  举报