Java学习之旅(二):生病的狗1(逻辑推导)
前言:本篇文章属于个人笔记,例化了一些代码,不知是否合理,请指教。
中午看到一位同学的面试题,觉得很烧脑,烧脑不能一个人烧,要大家一起烧。
村子中有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类,通过设计类属性和方法,类之间的关系,实现整个题目的逻辑推理和元素关系,敬请期待!
Java学习之旅(二):生病的狗1(逻辑推导)的更多相关文章
- Java学习-028-JSON 之二 -- 数据读取
JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...
- Java学习之旅开篇:运行机制及环境搭建
在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- Java学习之旅(二):生病的狗2(java例化)
废话不多说,直接上肝货,可运行. 代码简陋,逻辑关系可能还不是很严谨,欢迎交流. public class Owner { //属性部分 //狗主人肯定有一条狗,这条狗可以被别的主人检查,所以设置为p ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- 登录模块的进化史,带大家回顾java学习历程(二)
接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...
- 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口
从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...
随机推荐
- php面试题收藏
总结几个要素: 1.个人简介名字大写,内容需要详实,一是可以给人留下映像,二是减少不必要的与面试官交换个人信息的时间.准备一份好的口头自我介绍是很有必要的,毕竟准备一次能用很久,时间花在上面很实用,面 ...
- VUE 基础配置
原文:https://www.cnblogs.com/LearningOnline/p/9368838.html 1.安装Node.js等软件 报错: 解决: 原文:https://pdf-lib.o ...
- ACM之Java输入输出
本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...
- curl 设置超时时间
使用CURL时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间.连接超时时间用--connect-timeout参数来指定,数据传输的最大允许时间用-m参数来指定. curl -- ...
- tomcat找不到java_home
Tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 一眼就能看出来是jdk的环境有问题,但是用了 ...
- SCDM——多进(出)口流道的抽取
源视频.模型文件链接: https://pan.baidu.com/s/1ohhdq76Zjgu-hM9MJFaN9Q 提取码: kwpv
- GPU和显卡是什么关系?GPU会取代CPU吗?
一.GPU是什么?与显卡是什么关系?安装在什么地方?有单独的GPU板卡吗? GPU就是图像处理芯片,外表与CPU有点相似.显卡的芯片,AMD的一个技术,相当于电脑的处理器CPU,只不过它是显卡的大 ...
- Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- error Microsoft Visual C++ 14.0 is required 解决方案
Windows平台上,pip install fastFM scrapy等工具的时候,经常出现 error Microsoft Visual C++ 14.0 is required 的错误, ...
- 动手制作 java版本切换 多版本JDK安装 windows JDK版本 切换
[参考]windows下JDK版本之间的切换 1.下载各版本安装包,指定安装位置顺序安装 2.删除注册表,文件和环境变量 文件: C:\Windows\System32 下java相关文件如 jav ...