我解 zhyindividual (空幻闲人) 的面世题
应为不能回帖,只好发新贴了:
-----------------------------------------------------
问题:村里有50个人,每个人有一条狗,即有50只狗,这些狗中有病狗(不是传染病),每个人可以看除了自己的狗以外的所有狗,即49只狗。有病的狗一看就知道了,当有人推断出自己的狗是病狗的话则开枪打死自己的狗(当天知道),每人看后不准相互交流!第一天,没有枪响,第二天也没枪响,第三天,听见一阵枪响,请问村里有几只病狗,如何推算出来的?用程序实现解题~~
----------------------------------------------------
解答:一个人:
条件:如果看到病狗,则不能肯定自己的狗是否的病。(这个条件很重要)
分析:[个人注解:其实所有人第一天看完后,记下看到的数据后就可以回家等枪声做自己的判断了,不必再出来看]
他如果在外边看不到病狗,那么他当天可以确信自己的狗是病狗并杀死他,但第一天没有杀狗发生,可以证明每个人都看到了病狗,这么说病狗不是一只,>1,即=2只以上。“至少有2只病狗”的事实这个时候会被所有的人推断出来,他们各自会结合今天看到的病狗数来推断自己的狗是不是病狗,如果病狗真的只有两只,那么第二天就会有看到一只病狗的人意识到昨天没人杀狗而病狗2只自己却看到一只,那么毫无疑问自己的狗是病狗,杀之。
然而第二天仍然没有杀狗发生,可以说明一个问题:每个人都看到了至少2只病狗。这样,才可以推翻“看到一只病狗、肯定有2只病狗,然后杀自己病狗”的人必然发生的行为这个结论。
现在可以知道病狗数>2,即=3只,“病狗数至少3只”这个结论会刷新所有人的脑子。
到了第三天,其实也就是检验第二天的情况,这个时候,看到2只病狗的人肯定会毫不犹豫举枪杀死自己的狗,以此来证明“病狗数=3”这个真理。如果还没有人来杀狗,只能说明每个人都看到了至少3条病狗。恰好此时有人开了枪,可以说明有人看到了2只病狗,那么加上他杀的那只,正好是3只。太幸运了,只有3只,而且全部在第二天刚结束的时候同时被杀。:(