注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备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))
输出结果
张三说的是假话
李四说的是真话
王五说的是假话