注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正
现有 张三、李四和 王五 三个人,张三 说 李四 在说谎,李四说王五在说谎,而王五说张三 和 李四两人都在说谎。
三个人都可能说真话,也都可能说假话,那么如何来判断他们到底谁在说谎呢?
由问题描述可得到如下三个结论:
由于“张三说李四在说谎”,因此,如果张三说的是真话,则李四就在说谎;反之,如果张三在说谎,则李四说的就是真话。
由于“李四说王五在说谎”,因此,如果李四说的是真话,则王五就在说谎;反之,如果李四在说谎,则王五说的就是真话。
由于“王五说张三和李四两人都在说谎”,因此,如果王五说的是真话,则张三和李四两人就都在说谎;反之,如果王五在说谎,则张三和李四两人至少一人说的是真话。
解决这种问题,首先考虑“穷举法”,反正计算机喜欢一个一个的傻算。先将问题分析中得到的三个分析结果用表达式表达出来。
用变量 x、y 和 z 分别表示张三、李四和王五三人说话真假的情况。当 x、y 或 z 的值为 1 时表示该人说的是真话。值为 0 时表示该人说的是假话。
那么上面问题分析中的三个结论可以使用如下的表达式进行表示:
x
=
=
1
x==1
x==1 and
y
=
=
0
y==0
y==0 张三说的是真话,李四在说谎
x
=
=
0
x==0
x==0 and
y
=
=
1
y==1
y==1 张三在说谎,李四说的是真话
y
=
=
1
y==1
y==1 and
z
=
=
0
z==0
z==0 李四说的是真话,王五在说谎
y
=
=
0
y==0
y==0 and
z
=
=
1
z==1
z==1 李四在说谎,王五说的是真话
z
=
=
1
z==1
z==1 and
x
=
=
0
x==0
x==0 and
y
=
=
0
y==0
y==0 王五说的是真话,则张三和李四两人就都在说谎
z
=
=
0
z==0
z==0 and
x
+
y
!
=
0
x+y!=0
x+y!=0 王五在说谎,则张三和李四两人至少一人说的是真话
代码实现:
for x in range(2):
for y in range(2):
for z in range(2):
#if (x and (not y) or (not x) and y) and (y and (not z) or (not y) and z) and (z and x ==0 and y==0 or (not z) and x+y !=0):
if (x and (not y) or (not x) and y) and (y and (not z) or (not y) and z) and (z and x ==0 and y==0 or (not z) and x+y != 0):
a='真'if x==1 else '假'
b='真'if y==1 else '假'
c='真'if z==1 else '假'
print('张三说的是{}话\n李四说的是{}话\n王五说的是{}话'.format(a,b,c))
输出结果
张三说的是假话
李四说的是真话
王五说的是假话