前言:本篇文章屬於我的筆記,例化了一些代碼,不知是否合理,請指教。
中午看到一位同窗的面試題,以爲很燒腦,燒腦不能一我的燒,要你們一塊兒燒。java
村子中有50我的,每人有一條狗。在這50條狗中有病狗(這種病不會傳染),因而人們就要找出病狗。每一個人能夠觀察其餘的49條狗,以判斷它們是否生病,只有本身的狗不能看。觀察後獲得的結果不得交流,也不能通知病狗的主人。主人一旦推算出本身家的是病狗就要槍斃本身的狗,並且每一個人只有權利槍斃本身的狗,沒有權利打死其餘人的狗。第一天、次日都沒有槍響,到了第三天傳來一陣槍聲,問:有幾條病狗?如何推算得出?面試
鑑於殺害狗狗太過殘忍,我把其改成送醫救治。ide
村子中有50我的,每人有一條狗。在這50條狗中有病狗(這種病不會傳染),因而人們就要找出病狗。每一個人能夠觀察其餘的49條狗,以判斷它們是否生病,只有本身的狗不能看。觀察後獲得的結果不得交流,也不能通知病狗的主人。主人一旦推算出本身家的是病狗就要送醫救治,並且每一個人只有權利救治本身的狗,沒有權利救治其餘人的狗。第一天、次日都沒有人將狗送醫,到了第三天就有幾我的將狗狗送去救治了,問:有幾條病狗?如何推算得出?函數
其實一開始,我怎麼也想出不來,後來羣裏有位同窗發了答案。工具
我發現答案我都看不懂!this
淦!這不是侮辱個人智商嗎?spa
我豈能如此蒙羞,思考良久,很有頓悟,記錄於此,僅供參考。設計
其實在答案裏面,用的窮舉法,從1條狗,窮舉到n條狗,只是對於每一個假設的推導我着實沒有看懂(或者說,確實是由於我理解能力有限看不懂),因此推導過程,我本身從新進行了思考。code
首先,狗主人是一個類(class Owner),狗是一個類(class Dog)。而後根據題幹意思,咱們分別分析一下Owner類和Dog類的屬性和方法。對象
代碼以下:
public class Owner { //屬性部分 //狗主人確定有一條狗,這條狗能夠被別的主人檢查,因此設置爲public //可是這條狗的生病狀態,狗主人看不到 public Dog dog; //狗主人也有一輛車,用來將狗狗送醫(車不另外設置類型了,用String代替),車確定是私有咯 private String Koenigsegg = "一輛柯尼塞格"; //由於有不少主人,因此單個主人應該有一個本身的編號, public int ownerCode; //發現其餘狗裏生病的狗的數量,由於信息不能共享,因此這個屬性是私有的 private int sickDogRecord = 0; //本身的狗是否生病,生病爲true,沒有生病爲false public boolean dogIsSick; //方法部分 //狗主人能夠檢查其餘狗主人的狗 public void checkDog(Dog otherOwnerDog){ //若是這條狗有病,sickDog++; if(狗有病){ sickDogRecord++; } } //狗主人判斷本身的狗是否生病 public void IsSick(){ //if...若是本身的狗有病, //dogIsSick = true; } //殺狗 public void killDog(Dog myselfDog){ //調用狗的被送醫方法 myselfDog.beSendHospital(Koenigsegg);//傳入一個送醫的工具 //this.dog = NULL; } public Owner(){ } //構造方法重載 public Owner(Dog dog, int code, boolean sick){ this.dog = dog; this.ownerCode = code; this.dogIsSick = sick; } }
public class Dog { //屬性部分 //疾病狀態,有沒有生病,生病了是true,沒有生病是false boolean sick; //多少主人,就有多少條狗,狗也有編號 public int dogCode; //方法部分 //狗被送醫 public void beSendHospital(){ System.out.println(this.dogCode+"號狗被送去醫院。"); } //狗被送醫 重載 public void beSendHospital(String tool){ System.out.println(this.dogCode+"號狗被主人用"+tool+"送去醫院。"); } public Dog(){ } //構造函數重載 public Dog(boolean sick, int code){ this.sick = sick; dogCode = code; } }
其次,在邏輯上把狗主人在分爲兩個類,狗有病的主人爲A類,狗沒有病的主人爲B類。
開始推導:
根據題幹中「在這50條狗中有病狗(這種病不會傳染)」得知,有病的狗≥1。因而從1開始窮舉。
推論1:有病的狗≥1。
假設a:
有一條狗生病。
那麼全部的owner中就只有一個A,這個A檢查別人的狗以後,A.sickDogRecord = 0。
此時對於A來講,他是知道推論1的,且他沒有發現別的病狗,那麼生病的狗只能是本身的的狗了,A在第一天,就必須將狗送醫。
這與題乾結果不符.
假設a不成立。
推論2:若只有1條狗生病,那麼病狗的主人在第1天必定會將狗送醫治療。
假設b:
有兩條狗生病。
那麼A類就有兩個對象,首先對A1進行推理。
A1在檢查其餘狗狗以後,A.sickDogRecord = 1,A1將會有兩種判斷:
①:個人狗沒有病
A1認定本身的狗沒病,可是他又看到了1只病狗,A1會認爲,全部的狗狗裏只有1只病狗。
此時對於A1來講,根據題幹「每一個人能夠觀察其餘的49條狗,以判斷它們是否生病,只有本身的狗不能看」,他會以爲病狗的主人A2看到的狗全是健康的,因而會根據推論一和推論二,在第一天就將狗狗送醫,可是第一天什麼都沒發生。
判斷①不成立。
②:個人狗有病
判斷1不成立,可是A1確實是看到了1條病狗,第一天又沒有人送醫,那惟一能夠解釋的就是A1看到的病狗的主人A2也看到了其餘1條病狗,而且也以爲本身的狗不是病狗,因此A2沒有在第一天就將狗狗送醫治療,因而在次日,A1明白了一個道理:「我看到了一條病狗,這條病狗屬於一個我不認識的人,暫時用X(A2)代替,而X不能看本身的狗,同時看到了另一條病狗,那麼X看到的只有本身這條本身看不到的狗,那麼個人狗也是病狗!」因而,A1的狗有病,同時A2也以相同的推理判斷出,他本身的狗也是病狗,因而,次日,A1和A2同時將狗送醫去治療。
可是,次日實際上什麼也沒有發生!
假設b不成立!
推論3:若只有2條狗生病,那麼病狗的主人在第2天必定會將狗送醫治療。
假設c:
有三條狗生病
那麼A類的對象就有三個,繼續對A1進行推理。
A1在檢查其餘狗狗以後,A.sickDogRecord = 2,A1將會有兩種判斷:
①:A1的狗沒有病
A1認定本身的狗沒病,可是他又看到了2只病狗,A1會認爲,全部的狗狗裏只有2只病狗。
此時對於A1來講,根據題幹「每一個人能夠觀察其餘的49條狗,以判斷它們是否生病,只有本身的狗不能看」,他會以爲病狗的主人A2和A3各自能看到的只有一隻病狗,因而會根據推論1、推論二和推論三,在次日就將狗狗送醫,可是次日也什麼都沒發生。
判斷①不成立。
②:A1的狗有病
判斷1不成立,可是A1確實是看到了2條病狗,次日也沒有人送醫,那惟一能夠解釋的就是A1看到的病狗的主人A2和A3也同時看到了其餘2條病狗,而且也以爲本身的狗不是病狗,因此A2和A3沒有在次日就將狗狗送醫治療,因而在第三天,A1明白了一個道理:「我看到了2條病狗,這2條病狗屬於2個我不認識的人,暫時用X(A2)和Y(A3)代替,而X和Y不能看本身的狗,同時他們也各自看到了另外2條病狗,X看到的是Y的病狗和另一條病狗z,Y看到的是X的病狗和病狗z,而我看到的只有X和Y的病狗沒有其餘人的病狗,而且我看不到本身的狗,那麼個人狗確定就是那條x,也就是說個人狗也是病狗!」因而,A1的狗有病,同時A2和A3也以相同的推理判斷出,他本身的狗也是病狗,因而,第三天,A一、A2和A3同時將狗送醫去治療。
假設c成立!答案就是病狗有3條。
推論4:若只有3條狗生病,那麼病狗的主人在第3天必定會將狗送醫治療。
綜上所述,依次類推,最後能夠獲得結論:
有n條狗生病,那麼病狗的主人就會在第n天將狗送醫治療!
整個邏輯推理已經結束,可是我最想作的事尚未作。
接下里的目標就是,將題目例化成java類,經過設計類屬性和方法,類之間的關係,實現整個題目的邏輯推理和元素關係,敬請期待!