前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教。

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

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

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

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


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

  我发现答案我都看不懂!

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

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

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

  首先,狗主人是一个类(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各自能看到的只有一只病狗,于是会根据推论一、推论二推论三,在第二天就将狗狗送医,但是第二天也什么都没发生。

  判断①不成立。

  ②: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类,通过设计类属性和方法,类之间的关系,实现整个题目的逻辑推理和元素关系,敬请期待!

最新文章

  1. python入门-python解释器执行
  2. [转]DDD领域驱动设计基本理论知识总结
  3. Mongodb学习笔记三(Mongodb索引操作及性能测试)
  4. Eclipse连接到My sql数据库的操作总结/配置数据库驱动
  5. GridView块布局
  6. java Comparable 比较器的使用
  7. linux process 相关命令
  8. Powerful Regex
  9. VirtualBox扩展Ubuntu磁盘空间
  10. 关于JavaScript对象的键和值
  11. ognl.NoSuchPropertyException(没有对应属性异常)
  12. DNS,ARP,RARP,NAT,WINS的作用和区别
  13. PAT1012
  14. 谷歌Chrome浏览器提示adobe flash player已过期完美解决办法
  15. python redis存入字典序列化存储
  16. DataTable数据统计方法
  17. go语言学习--go中闭包
  18. MapReduce编程之Semi Join多种应用场景与使用
  19. 转载:Github项目解析(七)-->防止按钮重复点击
  20. java--Quartz 定时执行

热门文章

  1. three arrays HDU - 6625 (字典树)
  2. [Python] Python忽略warning警告错误
  3. Harbor基础
  4. 花了两个星期,我终于把 WSGI 整明白了
  5. js 数组元素位置互换
  6. nginx php-fpm 配置问题(2)
  7. js逆向分析之acorn和escodegen的使用
  8. [BUAA 软工]提问回顾与个人总结
  9. 高通平台sensor框架图【学习笔记】
  10. vue-router踩坑日记Unknown custom element router-view