Java学习之旅(二):生病的狗1(逻辑推导)阿兹尔的沙兵

中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧。

村子中有50个人,每人有一条狗。在这50条狗中有病狗(这种病不会传染),于是人们就要找出病狗。每个人可以观察其他的49条狗,以判断它们是否生病,只有自己的狗不能看。观察后得到的结果不得交流,也不能通知病狗的主人。主人一旦推算出自己家的是病狗就要枪毙自己的狗,而且每个人只有权利枪毙自己的狗,没有权利打死其他人的狗。第一天、第二天都没有枪响,到了第三天传来一阵枪声,问:有几条病狗?如何推算得出?

鉴于杀害狗狗太过残忍,我把其改为送医救治。

村子中有50个人,每人有一条狗。在这50条狗中有病狗(这种病不会传染),于是人们就要找出病狗。每个人可以观察其他的49条狗,以判断它们是否生病,只有自己的狗不能看。观察后得到的结果不得交流,也不能通知病狗的主人。主人一旦推算出自己家的是病狗就要送医救治,而且每个人只有权利救治自己的狗,没有权利救治其他人的狗。第一天、第二天都没有人将狗送医,到了第三天就有几个人将狗狗送去救治了,问:有几条病狗?如何推算得出?

其实一开始,我怎么也想出不来,后来群里有位同学发了答案。

我发现答案我都看不懂!

淦!这不是侮辱我的智商吗?

我岂能如此蒙羞,思考良久,颇有顿悟,记录于此,仅供参考。

其实在答案里面,用的穷举法,从1条狗,穷举到n条狗,只是对于每个假设的推导我着实没有看懂(或者说,确实是因为我理解能力有限看不懂),所以推导过程,我自己重新进行了思考。

首先,狗主人是一个类(classOwner),狗是一个类(classDog)。然后根据题干意思,我们分别分析一下Owner类和Dog类的属性和方法。

代码如下:

publicclassOwner{//属性部分//狗主人肯定有一条狗,这条狗可以被别的主人检查,所以设置为public//但是这条狗的生病状态,狗主人看不到publicDogdog;//狗主人也有一辆车,用来将狗狗送医(车不另外设置类型了,用String代替),车肯定是私有咯privateStringKoenigsegg="一辆柯尼塞格";//因为有很多主人,所以单个主人应该有一个自己的编号,publicintownerCode;//发现其他狗里生病的狗的数量,因为信息不能共享,所以这个属性是私有的privateintsickDogRecord=0;//自己的狗是否生病,生病为true,没有生病为falsepublicbooleandogIsSick;//方法部分//狗主人可以检查其他狗主人的狗publicvoidcheckDog(DogotherOwnerDog){//如果这条狗有病,sickDog++;if(狗有病){sickDogRecord++;}}//狗主人判断自己的狗是否生病publicvoidIsSick(){//if...如果自己的狗有病,//dogIsSick=true;}//杀狗publicvoidkillDog(DogmyselfDog){//调用狗的被送医方法myselfDog.beSendHospital(Koenigsegg);//传入一个送医的工具//this.dog=NULL;}publicOwner(){}//构造方法重载publicOwner(Dogdog,intcode,booleansick){this.dog=dog;this.ownerCode=code;this.dogIsSick=sick;}}classOwner

publicclassDog{//属性部分//疾病状态,有没有生病,生病了是true,没有生病是falsebooleansick;//多少主人,就有多少条狗,狗也有编号publicintdogCode;//方法部分//狗被送医publicvoidbeSendHospital(){System.out.println(this.dogCode+"号狗被送去医院。");}//狗被送医重载publicvoidbeSendHospital(Stringtool){System.out.println(this.dogCode+"号狗被主人用"+tool+"送去医院。");}publicDog(){}//构造函数重载publicDog(booleansick,intcode){this.sick=sick;dogCode=code;}}classDog

其次,在逻辑上把狗主人在分为两个类,狗有病的主人为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各自能看到的只有一只病狗,于是会根据推论一、推论二和推论三,在第二天就将狗狗送医,但是第二天也什么都没发生。

②: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也以相同的推理判断出,他自己的狗也是病狗,于是,第三天,A1、A2和A3同时将狗送医去治疗。

假设c成立!答案就是病狗有3条。

推论4:若只有3条狗生病,那么病狗的主人在第3天一定会将狗送医治疗。

综上所述,依次类推,最后可以得到结论:

有n条狗生病,那么病狗的主人就会在第n天将狗送医治疗!

整个逻辑推理已经结束,但是我最想做的事还没有做。

接下里的目标就是,将题目例化成java类,通过设计类属性和方法,类之间的关系,实现整个题目的逻辑推理和元素关系,敬请期待!

THE END
1.狗的病会不会传染给人问答频道一般情况下犬瘟是不会传染给人的。但是一般来说狗身上的皮肤病或者狗身上的寄生虫比如弓形虫等还是会...https://www.bohe.cn/ask/view/105682788.html
2....村长得到了个消息:村子里有狗得了传染病,因此需要村民每天观察...得了传染病,因此需要村民每天观察一次狗的情况.但是每个人只能观察别人家的狗是否生病,而看不到自家的狗.当判断出是自家的狗生病的时候,必须枪毙它,并且每个人只有权力枪毙自家的狗.第一天,村里没有枪声;第二天,还是没有枪声;第三天,村里有枪声了.这时,村长知道村子里有几只生病的狗了.请问村里有几只病狗?https://qb.zuoyebang.com/xfe-question/question/142fe0b11901cb4dde690bc253351cbe.html
3.狂犬病狗在潜伏期会传染给人嘛苹果绿养生网病情描述: 狂犬病狗在潜伏期会传染给人吗?医生回答(1) 陈璟副主任医师 宁夏医科大学总医院 普通内科 病情分析:如果一只狗感染了狂犬病病毒但没有生病,它在潜伏期内具有传染性,受感染狗的唾液中含有狂犬病病毒,如果人被它咬伤,这些病毒可以通过伤口进入人体,有一定的可能引起人类狂犬病,因此,被猫狗等易感染狂犬...https://m.pingguolv.com/ask/djgimjgd.html
4.新型冠状病毒个人防疫指南暂时没发现猫狗会传染这种病毒,目前暂时认为猫狗既不会因此生病,也不会作为长期携带者传给人。 不过,采纳美国疾控中心的建议,虽然我们目前没发现猫狗会传染这种病毒,因为新型冠状病毒尚有很多未知之处,保险起见,不能完全排除这种可能性。我们可以对此未知情况做点小小的努力。 https://weibo.com/ttarticle/p/show?id=2309404469612015124554
5.狗狗感冒会传染给人吗2020-02-1233440人阅读 狗狗感冒会传染给人吗 医生回答 (1) 陈少君 副主任医师中国中医科学院西苑医院 狗感冒不会传染给人。 感冒也叫急性上呼吸道感染,是包括鼻腔、咽或喉部急性炎症的总称。多数是由病毒感染引起,包括鼻病毒、腺病毒、流感和副流感病毒,另有20%~30%的上感由细菌引起。各种导致全身或呼吸道局部...https://m.chaonei.com/mip/qa/12770502.html
1.小狗支原体感染生病了会传染给人吗真实医生回答有关【支原体感染】的全套资料,病因、症状、自诊、治疗,相似病例全都有。点此查看>> 该条问诊记录已由春雨医生整理收起总结 问题描述: 您好医生 小狗支原体感染生病了 会传染给人吗(男,23岁) 分析及建议: 或者伤口接触到分泌物,这种没事的,不要太亲密接触就好了。 https://www.chunyuyisheng.com/pc/qa/IAzi4hKG89pKBQ5G1yfpUQ/
2.人的脚气能传染给狗吗?人的脚气能传染给狗吗?怎么预防 主人长得脚气竟然传染给了狗狗,有脚气的主人要注意了,您的脚气可能也会传染狗狗身上,脚气本身也是真菌造成,狗狗经常要主人的鞋子或者鞋带,有可能就会中了脚气的招,所以如果您有脚气问题,请务必注意不要把臭鞋放到外面狗狗经常能咬到的地方,要放到鞋柜里面,不要用脚触摸狗狗。 http://www.azhuyue.com/post/jiaoqichuanrangou.html
3.狗狗传染病会传染人吗狗狗有哪些病会传染给人→MAIGOO知识摘要:随着养宠爱宠人群的增多,宠物狗和人类有了更密切的接触,一起吃饭,一起睡觉...但其实狗狗因为自身体质不同,加上喜欢到处玩,很容易感染一些传染病,与人亲近的时候一些疾病也会传染给人类,那么狗狗有哪些病会传染给人呢?一起来了解下。 狗狗有哪些病会传染给人 ...https://m.maigoo.com/goomai/244815.html
4.尿路感染会传染人吗近1年来,我经常会出现尿频、尿急、尿痛的症状,去医院大夫说是尿路感染,尿路感染会传染人吗 李和程主任医师 西安交通大学第二附属医院 尿路感染传不传染,主要看尿液里是哪种致病菌。尿路感染属于细菌感染,在患者自身抵抗力低下的情况下,致病菌才会在尿路发病。尿路感染在泌尿外科发病率很高,其主要致病因素是由于...https://www.rwys.com/articlecontent/101223
5.“传染病预防”主题班会(通用20篇)学生6:患者的主要症状是咳嗽,浑身没有劲,软绵绵的,人渐渐消瘦,晚上睡觉常常盗汗,面部潮红,下午发低烧,胸口发闷,严重的时候还会咯血。这时病的传染性很强,因为病人咳嗽的时候,空气中会有许多结核菌。 (2)、小组讨论:如何从身边做起,如何搞好卫生,如何预防肺结核病? https://www.yjbys.com/cehuashu/zhutibanhui/4219459.html
6....每人有一条狗。在这50条狗中有病狗(这种病不会传染)。于是人们...高智商趣味题。村子中有50个人,每人有一条狗。在这50条狗中有病狗(这种病不会传染)。于是人们就要找出病狗。 每个人可以观察其他的49条狗,以判断它们是否生病(如果有病一定能看https://www.zybang.com/question/227d54a9763b00d4fb6ebfec98cf2509.html