题目:

村子中有50个人,每人有一条狗。在这50条狗中有病狗(这种病不会传染)。于是人们就要找出病狗。

每个人可以观察其他的49条狗,以判断它们是否生病(如果有病一定能看出来),只是自己的狗不能看。
 观察后得到的结果不得交流,也不能通知病狗的主人,一天只能看一次。主人一旦推算出自己家的是病狗就要枪毙自己的狗(发现后必须在一天内枪毙),
    而且每个人只有权利枪毙自己的狗,没有权利打死其他人的狗。

第一天大家全看完了,但枪没有响,第二天仍没有枪响。到了第三天传来一阵枪声,
   问村里共有几条病狗,如何推算得出?

=======================================

1. 思考: 第一时间还没有想到直接求解的办法。先采用假设法,简化处理。呵呵。。
 假设有1只狗,第几天会有枪声。
 假设有2只狗,第几天会有枪声。
 。。。

2. 解法: 按照这个思路。将信息抽象为两个类。村庄和拥有狗的村民。
  村民
      拥有一支狗,且狗的状态不可变。
      有查看别人家狗的动作。
      有kill自己狗的动作。
      另外,还需要提供一个,供别人查看自己的狗状态的动作。

村庄(简化为村庄的村长来组织/发起动作。。村庄与村长奇妙的合体了。。。。哈哈、、)
      村庄有村民入住动作。
      村长组织村民 看狗。。。
      村长给村民一段时间,用来杀自己家狗。

3. 总结:
  如果按照这个解法来看,能够用到的技术主要是并发计算了。
  1). 在每个人和每个人的动作互相独立,没有关联,可以完全解耦。可以并行。
  2). 每个人在观察完所有狗(除了自己)之后就有了判断,可以决定杀还是不杀了。
  3). 每天的事件也可以做到并行处理。但是会出现过度计算的问题。需要增加中断和撤销机制。

第一时间没有想到更好的解决方案。哎。思维短板啊。。。。。

附code:

import java.util.List;/*** Created by zkai on 2015/1/21.*/
public class PetOwner {private final boolean isSickDog;private boolean consideredOwnerSickDog;public PetOwner(boolean isSickDog) {this.isSickDog = isSickDog;}/*** @param day 第几天* @return 看到病狗的数量*/public boolean watchOtherDogAndThink(int day, List<PetOwner> petOwners) {int count = 0;for (PetOwner petOwner : petOwners) {if (petOwner != this && petOwner.dogStatus(this)) {count++;}}// 此处是最关键的。day 与 count 的关系。consideredOwnerSickDog = day - count == 1; // 看到病狗的数量,和日期的关系。return consideredOwnerSickDog;}/**** @return 是否枪杀了自己的狗。true:杀了,false:没杀*/public boolean killMyselfDog() {if (consideredOwnerSickDog) {System.out.println("▄︻┳═一   枪杀自己的狗~~~ 嘭~~~");}return consideredOwnerSickDog;}/*** 查看狗的状态,必须是非自己* @param watcher* @return*/public boolean dogStatus(PetOwner watcher) {if (watcher == null || watcher == this) {throw new IllegalStateException("自己不能看自己的狗");}return isSickDog;}
}
package com.wyfbilling.common.logger.contract;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** *** Created by zkai on 2015/1/21.*/
public class Village {private final List<PetOwner> petOwners;/**** @param petOwnerCount 村民数量* @param sickDogCount 病狗的数量*/public Village(int petOwnerCount,int sickDogCount) {petOwners = Collections.unmodifiableList(init(petOwnerCount, sickDogCount));}/*** 村民入住* @param petOwnerCount 村民数量* @param sickDogCount 病狗的数量*/private List<PetOwner> init(int petOwnerCount, int sickDogCount) {List<PetOwner> list = new ArrayList<>();for (int i = 0; i < petOwnerCount; i++) {PetOwner petOwner;if (i < sickDogCount) {// 拥有病狗的主人petOwner = new PetOwner(true);} else {// 拥有健康狗的主人petOwner = new PetOwner(false);}list.add(petOwner);}return list;}/*** 观察狗,并思考自己拥有的是否是病狗* @param day*/public void watchDogAndThinkTime(int day) {for (PetOwner petOwner : petOwners) {petOwner.watchOtherDogAndThink(day, petOwners);}}/*** 杀狗时间。。。** @return 是否有杀狗动作 true:有村民杀了狗。*/public int killDogTime() {int killDogEventCount = 0;for (PetOwner petOwner : petOwners) {if (petOwner.killMyselfDog())killDogEventCount++;}return killDogEventCount;}public static void main(String[] args) {Village village = new Village(50, 10);// 假设一个村庄有50个村民,有3只病狗。for (int day = 1; day < 10000; day++) {// 防御式编程,day设置最大,防止编程错误导致无限循环。village.watchDogAndThinkTime(day);int killDogEventCount = village.killDogTime();if (killDogEventCount > 0) {System.out.format("今天是第%d天,今天发生了%s次枪击事件!!!", day, killDogEventCount);break;}}}
}

病狗问题 -- 假设法求解相关推荐

  1. 逻辑思维训练——假设法

    对于每一个问题,我们既要考虑它原有的知识基础,又要考虑它下联的知识内容.只有这样,我们才能更好地激发思维,并逐步形成知识脉络.实际上,提高逻辑思维能力的关键就在于要使思维脉络清晰化,思维脉络的重点理清 ...

  2. 有 50 家人家,每家一条狗。有一天警察通知, 50 条狗当中有病狗,行为和正常狗不一样。每人只能通过观察别 人家的狗来判断自己家的狗是否生病,而不能看自己家的狗,如果判断出自己家的狗病了,就必须当天

    文章目录 题目 一.题目获得的条件 二.假设法解决题目 1.举例子 2.深入理解 总结 题目 有 50 家人家,每家一条狗.有一天警察通知, 50 条狗当中有病狗,行为和正常狗不一样.每人只能通过观察 ...

  3. (找不同问题)有 50 家人家,每家一条狗。有一天警察通知, 50 条狗当中有病狗,行为和正常狗不一样

    问题描述 有 50 家人家,每家一条狗.有一天警察通知,50 条狗当中有病狗,行为和正常狗不一样.每人只能通过观察别人家的狗来判断自己家的狗是否生病,而不能看自己家的狗,如果判断出自己家的狗病了,就必 ...

  4. IBM面试题 50条狗 有病狗 有几条病狗?

    题目:村子里有50个人,每人有一条狗,在这50条狗中有病狗(这种病不传染),于是人们要找出病狗. 每个人可以观察其他49条狗,以判断他们是否生病,(如果有病一定能看出来),只有自己的狗不能看,观察后得 ...

  5. 50条狗中有多少条病狗?

    问题: 村子中有50个人,每人有一条狗.在这50条狗中有病狗(这种病不会传染).于是人们就要找出病狗.每个人可以观察其他的49条狗,以判断它们是否生病, 只有自己的狗不能看.观察后得到的结果不得交流, ...

  6. 病狗问题和舞会戴帽子问题

    1.有50 家人家,每家一条狗.有一天警察通知,50 条狗当中有病狗,行为和正常狗不一样.每人只能通过观察别人家的狗来判断自己家的狗是否生病,而不能看自己家的狗,如果判断出自己家的狗病了,就必须当天一 ...

  7. 微软经典面试题------病狗问题

    1.狗的主人无法判断自己的狗是否是病狗,却能够分辨其他的狗是否有病,现在,上级传来通知,要求住户处决这些病狗,并且不允许指认他人的狗是病狗(就是只能判断自己的),过了7天之后,所有的病狗都被处决了,问 ...

  8. 有50 只狗,找出其中病狗

    题目: 有50 家人家,每家一条狗.有一天警察通知,50条狗当中有病狗,行为和正常狗不一样.每人只能通过观察别人家的狗来判断自己家的狗是否生病,而不能看自己家的狗,如果判断出自己家的狗病了,就必须当天 ...

  9. 在50户人家的狗中寻找病狗数量的趣味题目(详细解释)

    这一类的题目其实是一种很有意思的智力题. 题目描述 有50户人家,每家一条狗.有一天警察同志通知,在这50条狗中有病狗,它的行为和其它狗不一样,现在每个人只能通过观察其它人家的狗来判断自己家的狗是否生 ...

最新文章

  1. 带头节点单链表的增删改查
  2. Jtabbedpane设置透明、Jpanel设置透明
  3. 3D打印产业化机遇与挑战
  4. [转]sqlserver2008锁表语句详解
  5. 关联规则挖掘算法_数据挖掘 | 关联规则分析
  6. python 图片转视频ffmpeg_python图片转视频(opencv),ffmpeg压缩视频
  7. 明星分手文案火了!为了营销 你们这些商家也是很努力啊...
  8. JDK、STS、SVN、Tomcat 、mysql的下载安装及环境变量的配置和sts修改字体大小
  9. 74系列标准逻辑集成芯片分类
  10. 计算机网络习题集与习题解析 pdf,计算机网络习题集与答案.pdf
  11. Spark (一):大数据概述
  12. 修改计算机的用户名小工具,修改电脑用户名win10
  13. 亚马逊云的服务器(EC2)+阿里云的域名,添加ssl证书
  14. 为什么30岁的工程师容易跳槽?
  15. Linux系统结构和文件管理
  16. 掏心掏肺,教你如何把苍白的人生写成老板都心动的简历
  17. [渝粤教育] 西南科技大学 房屋建筑学 在线考试复习资料(1)
  18. BootStrap2学习日记20---定制缩略图
  19. 安裝 Installation of Torch7, Cuda, Cudnn, Nvidia Driver with GTX1070
  20. Django中DateField与DateTimeField的特殊参数auto_add_now和auto_now

热门文章

  1. ios 请在设置中打开相机权限_开启运动与健身权限 iOS10相机相册等权限的使用、检测并引导用户开启权限 - 非主流娱乐网...
  2. 白色iPhone4即将上市
  3. 【python教程入门学习】详解python编译器和解释器的区别
  4. 数据挖掘与机器学习的十大算法
  5. 《Python小游戏汇总》- 1. 表白神器
  6. 《Oracle 入门教程》第 07 篇 限制返回行数
  7. 蓝桥杯真题跑步锻炼(Excel快速准确解法)
  8. 图像处理:变电站巡视中图像分析方法的研究步骤
  9. 【M1 Macbook】Mac用RealVNC远程连接Window桌面
  10. SpringBoot+Vue实现第三方百度登录(二)