【100个python算法超详细讲解】@谷哥技术
1.问题描述
有A、B、C、D、E这5个人,每个人额头上都贴了一张黑或白的纸。5人对坐,每
个人都可以看到其他人额头上纸的颜色。
A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑纸。”
B说:“我看见其他4人额头上贴的都是黑纸。”
C说:“我看见1人额头上贴的是白纸,其他3人额头上贴的是黑纸。”
D说:“我看见4人额头上贴的都是白纸。”
E什么也没说。
现在已知额头上贴黑纸的人说的都是谎话,额头上贴白纸的人说的都是实话。问
这5人谁的额头上贴的是白纸,谁的额头上贴的是黑纸?
2.问题分析
该问题是一个逻辑推理问题。分析A、B、C、D这4个人所说的话可以得出4个条
件。
假设用变量a、b、c、d、e分别代表A、B、C、D、E这5个人额头上贴纸的颜色,
当变量的取值为1时表示该人额头上贴纸的颜色为白色,当变量的取值为0时表示该人
额头上贴纸的颜色为黑色。则分析题目中4个人所说的话如下:
A说:“我看见有三人额头上贴的是白纸,一人额头上贴的是黑纸。”
如果A额头上贴的是白纸,那么他说的是实话,则有表达式:a and b+c+d+e==3。
如果A额头上贴的是黑纸,那么他说的是谎话,则有表达式:(not a) and
b+c+d+e!=3。
B说:“我看见其他4人额头上贴的都是黑纸。”
如果B额头上贴的是白纸,那么他说的是实话,则有表达式:b and a+c+d+e==0。
如果B额头上贴的是黑纸,那么他说的是谎话,则有表达式:(not b) and
a+c+d+e!=0。
C说:“我看见一人额头上贴的是白纸,其他三人额头上贴的是黑纸。”
如果C额头上贴的是白纸,那么他说的是实话,则有表达式:c and a+b+d+e==1。
如果C额头上贴的是黑纸,那么他说的是谎话,则有表达式:(not c) and
a+b+d+e!=1。
D说:“我看见4人额头上贴的都是白纸。”
如果D额头上贴的是白纸,那么他说的是实话,则有表达式:d and a+b+c+e==4。
如果D额头上贴的是黑纸,那么他说的是谎话,则有表达式:(not d) and
a+b+c+e!=4。
3.算法设计
求解逻辑推理类问题的关键就是写出正确的逻辑表达式。将问题分析中列出的限
定条件用程序语言描述清楚后就可以使用穷举法来获得最终的判断结果。
下面使用Python中的逻辑表达式将问题分析中得到的几个条件表达出来,得到的逻
辑表达式如下:
(a and b+c+d+e = =3 or (not a) and b+c+d+e !=3) and (b and a+c+d+e = =0 or (not b) and a+c+d+e !=0) and
( c and a+b+d+e ==1 or (not c) and a+b+d+e !=1) and (d and a+b+c+e = =4 or (not d) and a+b+c+e !=4)
在程序中穷举每个人额头贴纸颜色的所有可能情况,并代入上面的逻辑表达式中
进行推理运算,则使该逻辑表达式的值均为“真”的结果就是正确的结果。
4.确定程序框架
在程序中使用五重循环来穷举所有可能情况,该程序的流程图如图6.17所示。
5.完整的程序
根据上面的分析,编写程序如下:
#!/usr/bin/python3
# -*- coding: ?TF-8 -*-
#author:liuhefei
#desc: 黑与白
if __name__=="__main__":
#A、B、C、D、E这5个人,每个人额头上都贴了一张黑或白的纸
#变量a、b、c、d、e分别代表A、B、C、D、E这5个人额头上贴纸的颜色,
# 当变量的取值为1时表示该人额头上贴纸为白色,当变量取值为0时表示该人额头上贴纸为
黑色
for a in range(2): #a、b、c、d、e变量的值要么为0,要么为1,0为黑色,1为白色
for b in range(2):
for c in range(2):
for d in range(2):
for e in range(2):
if (a and (b + c + d + e == 3) or ((not a) and (b + c
+ d + e != 3))): #A
if(b and (a + c + d + e == 0) or ((not b) and (a +
c + d + e != 0))): #B
if(c and (a + b + d + e == 1) or ((not c) and
(a + b + d + e != 1))): #C
if (d and (a + b + c + e == 4) or ((not d)
and (a + b + c + e != 4))): #D
a1 = "白" if a==1 else "黑" #三元表达式
b1 = "白" if b==1 else "黑"
c1 = "白" if c==1 else "黑"
d1 = "白" if d==1 else "黑"
e1 = "白" if e==1 else "黑"
print("A额头上的贴纸是" + a1 + "色的.")
print("B额头上的贴纸是" + b1 + "色的.")
print("C额头上的贴纸是" + c1 + "色的.")
print("D额头上的贴纸是" + d1 + "色的.")
print("E额头上的贴纸是" + e1 + "色的.")
6.运行结果
在PyCharm下运行程序,结果如图6.18所示。由图6.18可见,A、B、D额头上贴的
是黑纸,C、E额头上的贴的是白纸。



