1. 程式人生 > >IBM面試題 50條狗 有病狗 有幾條病狗?

IBM面試題 50條狗 有病狗 有幾條病狗?

題目:村子裡有50個人,每人有一條狗,在這50條狗中有病狗(這種病不傳染),於是人們要找出病狗。

每個人可以觀察其他49條狗,以判斷他們是否生病,(如果有病一定能看出來),只有自己的狗不能看,觀察後得到的結果不得交流,也不能通知病狗的主人。主人一旦推算出自己家的狗是病狗就是槍斃自己的狗(發現後必須在一天內槍斃),而且每個人只有權利槍斃自己的狗,沒有權利打死其他人的狗。

第一天大家全看完了,但槍沒有響,到了第三天傳來一陣槍聲,問村裡共有幾條病狗,如何推算出來的?

解答:第一種推論:

A、假設有1條病狗,病狗的主人會看到其他狗都沒有病,那麼就知道自己的狗有病,所以第一天晚上就會有槍響。因為沒有槍響,說明病狗數大於1。



??B、假設有2條病狗,病狗的主人會看到有1條病狗,因為第一天沒有聽到槍響,是病狗數大於1,所以病狗的主人會知道自己的狗是病狗,因而第二天會有槍響。既然第二天也每有槍響,說明病狗數大於2。

  由此推理,如果第三天槍響,則有3條病狗。

   第二種推論

1 如果為1,第一天那條狗必死,因為狗主人沒看到病狗,但病狗存在。

2 若為2,令病狗主人為a,b。 a看到一條病狗,b也看到一條病狗,但a看到b的病狗沒死故知狗數不為1,而其他人沒病狗,所以自己的狗必為病狗,故開槍;而b的想法與a一樣,故也開槍。
由此,為2時,第一天看後2條狗必死。

3 若為3條,令狗主人為a,b,c。 a第一天看到2條病狗,若a設自己的不是病狗,由推理2,第二天看時,那2條狗沒死,故狗數肯定不是2,而其他人沒病狗,所以自己的狗必為病狗,故開槍;而b和c的想法與a一樣,故也開槍。


由此,為3時,第二天看後3條狗必死。

??4 若為4條,令狗主人為a,b,c,d。a第一天看到3條病狗,若a設自己的不是病狗,由推理3,第三天看時,那3條狗沒死,故狗數肯定不是3,而其他人沒病狗,所以自己的狗必為病狗,故開槍;而b和c,d的想法與a一樣,故也開槍。
由此,為4時,第三天看後4條狗必死。

5 餘下即為遞推了,由年n-1推出n。

答案:n為4。第四天看時,狗已死了,但是在第三天死的,故答案是3條