Java學習之旅(二):生病的狗1(邏輯推導)

 

前言:本篇文章屬於我的筆記,例化了一些代碼,不知是否合理,請指教。

 

 

  中午看到一位同窗的面試題,以爲很燒腦,燒腦不能一我的燒,要你們一塊兒燒。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; } }
class Owner

 

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; } }
class Dog

 

  其次,在邏輯上把狗主人在分爲兩個類,狗有病的主人爲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類,經過設計類屬性和方法,類之間的關係,實現整個題目的邏輯推理和元素關係,敬請期待!

相關文章
相關標籤/搜索