100个python算法超详细讲解:谁是窃贼
【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算法超详细讲解:谁是窃贼相关推荐
- 100个python算法超详细讲解:搬山游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...
- 100个python算法超详细讲解:平分7筐鱼
[100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...
- 100个python算法超详细讲解:邮票组合
[100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...
- 100个python算法超详细讲解:递归解决年龄问题
[100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...
- 100个python算法超详细讲解:抢30游戏
[100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...
- 100个python算法超详细讲解:卡布列克常数
[100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...
- 100个python算法超详细讲解:孪生素数
[100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...
- 100个python算法超详细讲解:狼追兔子
[100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...
- 100个python算法超详细讲解:猴子吃桃
[100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...
最新文章
- Walking on the path of Redis --- Redis configuration
- 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
- no module named 'social_core'
- jmeter提取mysql数据_通过jmeter读取数据库数据,并取值作为请求的入参
- 【ECCV2020】完整论文集part2
- (64)Verilog HDL多模块重复例化
- 全局变量和静态变量的区别
- 视觉SLAM十四讲 安装OpenCV
- 网管员应该掌握好的学习方法
- 黑苹果macOS Catalina 10.15.4 安装过程详细记录
- Duet Display在PC端无法连接怎么办?
- 子网地址和广播地址的计算
- WPS打不出英文引号
- Oracle中Start With的用法
- 【MM系列】SAP MM物料账在制品承担差异功能及配置
- 同义词,反义词(antonym,synonym)的英文表达理解
- 关于SQL数据表存储过程表名前缀换成dbo代码
- 学习3D游戏建模线上和线下学习的区别有哪些?
- Win10下系统自带的各种监测工具
- 气质数据提取物质信息并批量查阅、翻译
热门文章
- 不同坐标系下角速度_星空的经纬线:浅谈赤道坐标系
- 编程语言C/C++(一)
- 使用树莓派搭建私人存储云盘
- 【艺术奖】自戕行为作品获英格·莫拉丝奖
- docker公共存储库_docker公共仓库和私有仓库
- c# 非阻塞算法_C#阻塞模式和非阻塞模式
- 中国联通卡上在苹果5上显示无服务器,苹果iPhone8显示无服务怎么办
- GML,SVG,VML COMPARATION
- 高效率必备工具——生活篇
- Fruity Loops Studio21最新中文版水果音乐制作软件