【100个python算法超详细讲解】@谷哥技术

1.问题描述
警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃
贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。
下面是这4个人给警察的回答。
·?说:“乙没有偷,是丁偷的。”
·乙说:“我没有偷,是丙偷的。”
·丙说:“?没有偷,是乙偷的。”
·丁说:“我没有偷。”
请根据这4个人的回答判断谁是窃贼。
2.问题分析
显然该题是一个逻辑推断问题。已知4个人中的每个人要么是诚实
的,要么总是说谎,那么如何来判断他们到底谁是窃贼呢?
由问题描述可知,?、乙、丙、丁4人中仅有一名窃贼,且这4个
人中每个人要么是诚实的,要么总是说谎。分析?、乙、丙3人所说的
话可以发现,他们每人都说了两句话,即“X没有偷,X偷的”,因此,
不论这三人是否说谎,他们所提到的这两个人中必有一个是窃贼。而
丁只说了他自己没有偷,故无法判断其真假。
假设用变量A、B、C、D分别代表4个人,变量的值为1代表该人是
窃贼,则根据4个人的说法可列出下面的4个条件:
·?说:“乙没有偷,是丁偷的。”——B+D=1 ①
·乙说:“我没有偷,是丙偷的。”——B+C=1 ②
·丙说:“?没有偷,是乙偷的。”——A+B=1 ③
·丁说:“我没有偷。”——A+B+C+D=1 ?
由于?、乙、丙3人的话中都提到了两个人,其中必有一人是小
偷,故在根据他们的话列出条件表达式时,可以不关心谁说的是真
话,谁说的是假话。
由于丁的话无法判断真假,故根据丁的话列出的表达式只反映了4
人中仅有一名是窃贼的条件。
3.算法设计
该问题的关键是使用Python中的逻辑表达式将问题分析中得到的4
个条件表达出来,逻辑表达式如下:
B+D==1 and B+C==1 and A+B==1 ?
条件④表示A、B、C、D中必有一个为1。
在程序中可依次假定?、乙、丙、丁分别为窃贼,代入⑤进行测
试,满足条件⑤的那个人为窃贼,具体如下:
1)先假定?为窃贼,即A=1、B=0、C=0、D=0,代入条件⑤测试
是否成立,若成立则不再对乙、丙、丁进行测试。
2)若不成立,则再假定乙为窃贼,即A=0、B=1、C=0、D=0,代
入条件⑤测试是否成立,若成立则可确定乙为窃贼,不再对丙、丁进行
测试。
3)若不成立,再假定丙为窃贼,即A=0、B=0、C=1、D=0,代入
条件⑤测试是否成立,若成立则可确定丙为窃贼,不再对丁进行测试。
4)若不成立,再假定丁为窃贼,即A=0、B=0、C=0、D=1,代入
条件⑤测试是否成立,若成立则确定丁为窃贼。
4.确定程序框架
程序的流程图如图6.7所示。

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: ?TF-8 -*-
#author: liuhefei
#desc: 谁是窃贼
if __name__ == "__main__":
#?、乙、丙、丁分别用A、B、C、D代表。A、B、C、D的值要么为1,要么为0
# 为1表示是窃贼,为0表示不是
# 满足4个条件:B+D=1,B+C=1,A+B=1,A+B+C+D=1
A, B, C, D = 1, 0, 0, 0
for i in range(1, 4+1): #i=1,2,3,4
if B+D == 1 and B+C == 1 and A+B == 1:
break
else:
if i == 1:
A=0
B=1
if i == 2:
B=0
C=1
if i == 3:
C=0
D=1
print("判断结果:")
if i == 1:
print("?是窃贼\n")
if i == 2:
print("乙是窃贼\n")
if i == 3:
print("丙是窃贼\n")
if i == 4:
print("丁是窃贼\n")

程序说明如下:
·使用变量i控制循环次数,因为要分别对?、乙、丙、丁进行测
试,故循环次数为4。
·输出时根据i的取值来确定输出结果。
6.运行结果
在PyCharm下运行程序,结果如图6.8所示。由运行结果可知,乙
是窃贼。

100个python算法超详细讲解:谁是窃贼相关推荐

  1. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  2. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  3. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  4. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  5. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  6. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  7. 100个python算法超详细讲解:孪生素数

    [100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...

  8. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

  9. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

最新文章

  1. Walking on the path of Redis --- Redis configuration
  2. 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
  3. no module named 'social_core'
  4. jmeter提取mysql数据_通过jmeter读取数据库数据,并取值作为请求的入参
  5. 【ECCV2020】完整论文集part2
  6. (64)Verilog HDL多模块重复例化
  7. 全局变量和静态变量的区别
  8. 视觉SLAM十四讲 安装OpenCV
  9. 网管员应该掌握好的学习方法
  10. 黑苹果macOS Catalina 10.15.4 安装过程详细记录
  11. Duet Display在PC端无法连接怎么办?
  12. 子网地址和广播地址的计算
  13. WPS打不出英文引号
  14. Oracle中Start With的用法
  15. 【MM系列】SAP MM物料账在制品承担差异功能及配置
  16. 同义词,反义词(antonym,synonym)的英文表达理解
  17. 关于SQL数据表存储过程表名前缀换成dbo代码
  18. 学习3D游戏建模线上和线下学习的区别有哪些?
  19. Win10下系统自带的各种监测工具
  20. 气质数据提取物质信息并批量查阅、翻译

热门文章

  1. 不同坐标系下角速度_星空的经纬线:浅谈赤道坐标系
  2. 编程语言C/C++(一)
  3. 使用树莓派搭建私人存储云盘
  4. 【艺术奖】自戕行为作品获英格·莫拉丝奖
  5. docker公共存储库_docker公共仓库和私有仓库
  6. c# 非阻塞算法_C#阻塞模式和非阻塞模式
  7. 中国联通卡上在苹果5上显示无服务器,苹果iPhone8显示无服务怎么办
  8. GML,SVG,VML COMPARATION
  9. 高效率必备工具——生活篇
  10. Fruity Loops Studio21最新中文版水果音乐制作软件