【趣味学算法】05_谁在说谎

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备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))      

输出结果

张三说的是假话
李四说的是真话
王五说的是假话
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值