关于微软面试“狗”的问题,我有新解了!!!
hanyh 2001-10-25 01:45:07 原题:
一个大院子里住了50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。然而所有主人和他们的狗都不能够离开自己的房子,主人与主人之间也不能通过任何方式进行沟通,他们能做的只是通过窗户观察别人家的狗是否生病从而判断自己的狗病否。(就是说,每个主人只能看出其他49家的狗是不是生病,单独看自己的狗是看不出来的)
第一天没有枪声,第二天还是没有枪声,第三天传出一阵枪声,问有多少条狗被枪杀。
我的答案:
我认为可能是4条被打死。
如果有n条狗生病,则他们看到病狗的数目应该是n或n-1;
假如只有1条狗有病的话,假设他的主人是A,则A看到其它的狗都没有病,所以知道是自己家的狗有病,所以,第一天A就应该开枪打死他的狗;
假如有2条狗有病,假设他的主人是A,B,第一天,A和B都互相看到了对方的狗有病,而其他人家的狗都没有病,注意了:A看到了B的狗有病,但是没有看到B把他的狗打死,说明B也看到有病的狗,因为其他48家的狗都没有病,那么自己的家的狗就可能有病了,不过还有一种可能,就是现在B正在看其它的狗,还没有浏览完所有的狗;但是B现在也看到了同样的问题。这样可能会出现3种情况:
1、A,B同时把自己的狗打死,因为他们都知道对方的狗有病,但是不确定自己的狗是否有病,但是为了以防万一,还是打死为妙;
2、A把自己家的狗打死。因为他确定B也看到了有狗生病,而B之外的狗都没有病,那一定是自己家的狗了;
3、B把自己家的狗打死。原因同上。
但是第2,3种情况不能把有病的狗全部打死,因为这中间有一个时间差,一旦其中有一个人把狗打死后,另一个人可能会以为他看到别人的狗都是没有病的(当然包括自己的)。所以应该有一个约定:如果当时能够判断自己的狗有病的话,就立即打死。在第一天晚上23点59分59秒的时候,大家可能都已经把另外49家人的狗的状态都看了一遍,都知道了别人家的狗是否生病。在这之前,因为没有枪声,说明A,B自己都不确定自己的狗有病,所以A,B都知道了不仅仅是对方的狗有病,而其他的狗都没有病,所以只有自己的狗有病,因而就可以确定了,所以在第二天0点0分0秒的时候,就应该听到2声枪响。
假如有3条狗有病的话,假设他们的主人是A、B、C,因为第一天他们已经把所有的狗的状态都看过了,所以他们就只需要考虑什么时候该听到枪声,和什么时候应该开枪打死自己的狗的问题。经过上面的分析,A想到:我看到了2条狗有病,如果只有B,C两条病狗的话,第二天0点0分0秒的时候就应该听到他们开枪,因为那个时候他们就可以确定自己的狗肯定有病,而条件是一旦确定狗有病的时候就立刻开枪打死狗。但是如果那个时候没有听到枪声,说明有病的狗不只是2条,当然就只有自己这一条了。而B,C两人也是这么想的,所以在0点0分0秒以后的不久,他们3人都可以确定自己家的狗有病了,所以不久后就可以听到他们人开枪的声音。
而假如是4条病狗的话,病狗的主人知道如果第二天0点0分0秒以后的不久没有听到另3人开枪的话,自己的狗或许就有病了,但是这个不久是多长时间,没有一个具体的约定,但是他最多会等到第三天的0点0分0秒,因为在一秒前他没有听到枪声的话,就说明病狗不会只有3条了。
总之,如果是5条病狗的话,会在第三天0点0分0秒后的不久听到枪声。
在第n天听到枪声,如果是在那天的0点0分0秒时开枪的话,就应该有2n-2条狗被杀,如果是在其他时间,就应该有2n-1条狗被杀。