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

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

  村子中有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(逻辑推导)的更多相关文章

  1. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

  2. Java学习之旅开篇:运行机制及环境搭建

    在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...

  3. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  4. Java学习之旅(二):生病的狗2(java例化)

    废话不多说,直接上肝货,可运行. 代码简陋,逻辑关系可能还不是很严谨,欢迎交流. public class Owner { //属性部分 //狗主人肯定有一条狗,这条狗可以被别的主人检查,所以设置为p ...

  5. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  6. 滴滴Booster移动APP质量优化框架 学习之旅 二

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...

  7. 登录模块的进化史,带大家回顾java学习历程(二)

    接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...

  8. 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口

    从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...

  9. java学习-zxing生成二维码矩阵的简单例子

    这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...

随机推荐

  1. Pandas模块 -- 数据类型转换,描述统计

    car=pd.read_csv(r'E:\Python\sec_cars.csv',sep=',').head(32) # print(car) print("数据集的类型:",t ...

  2. micronaut 学习 二 创建一个简单的服务

    micronaut 提供的cli 很方便,我们可以快速创建具有所需特性的应用,以下是一个简单的web server app 创建命令 mn create-app hello-world 效果 mn c ...

  3. Kafka的基本概念

    Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级开源项目. Top ...

  4. A1128 | 逻辑想象能力、简洁高效美观的代码、memset的使用情景

    写了三遍才AC,这真是对智商极大的侮辱 C++代码: #include <stdio.h> #include <memory.h> #include <math.h> ...

  5. 菜鸟网络Java面试-社招-一面(2019/11)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  6. js限制输入数字能输入小数点,js定义数组,js往数组中添加数据,js将字符型转为数字型,除法结果保留两位小数——js小测:计算比赛得分

    一个朋友跟我说要去给某个比赛算分: 规则:去掉最低分最高分求平均分: 最近在学习大数据可视化——图谱,用到js一些东西,所以今天就用js练练 用到知识点: js限制输入数字能输入小数点,js定义数组, ...

  7. SpringBoot:使用Jenkins自动部署SpringBoot项目(二)具体配置

    1.启动Jenkins 在浏览器输入ip:port后,进入Jenkins初始化界面,需要查看文件,得到密码. 输入密码进入初始化界面,选择推荐插件安装. 安装完成创建账号,进入Jenkins主界面. ...

  8. ELK(Elasticsearch + Logstash + Kibana) 日志收集

    单体应用或微服务的场景下,每个服务部署在不同的服务器上,需要对日志进行集重收集,然后统一查看所以日志. ELK日志收集流程: 1.微服务器上部署Logstash,对日志文件进行数据采集,将采集到的数据 ...

  9. [Beta]Scrum Meeting#4

    github 本次会议项目由PM召开,时间为5月9日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 改进界面 改进界面 bh ...

  10. vs2017+qt5.x编译32位应用<转>

    原文地址:https://www.cnblogs.com/woniu201/p/10862170.html 概述 最近有同学私信我,问如何使用vs2017+qt5.10编译出32位的应用,需要使用ms ...