马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 鱼C-小师妹 于 2021-3-30 16:03 编辑
如果弄明白上一讲的配对问题,那么这种“逻辑推断”类的问题,解法都大同小异!
核心点就是:
条件找到了,代码也就有了。
往往找条件这步最能体现出不同人的“语文功底”差异。
不行,这一讲我们升级下难度,来,看题:
现有 A、B 和 C 三个人,A 说 B 在说谎,B 说 C 在说谎,而 C 说 A 和 B 两人都在说谎。
还是通过编程求出这三个人中到底谁说的是真话,谁说的是假话。
从小师妹的学业生涯经验来看,题目字数越少,坑越多。
A 、B 和 C 三个人都可能说真话,也都可能说假话,那么如何来判断他们到底谁在说谎呢?
由问题描述可得到如下三个结论:
- 由于“张三说李四在说谎”,因此,如果张三说的是真话,则李四就在说谎;反之,如果张三在说谎,则李四说的就是真话。
- 由于“李四说王五在说谎”,因此,如果李四说的是真话,则王五就在说谎;反之,如果李四在说谎,则王五说的就是真话。
- 由于“王五说张三和李四两人都在说谎”,因此,如果王五说的是真话,则张三和李四两人就都在说谎;反之,如果王五在说谎,则张三和李四两人至少一人说的是真话。
这些结论就是一个一个条件~
看到现在,我们应该养成了“条件反射”!
解决这种问题,首先考虑“穷举法”,反正计算机喜欢一个一个的傻算。
先将问题分析中得到的三个分析结果用表达式表达出来。
用变量 x、y 和 z 分别表示张三、李四和王五三人说话真假的情况。
当 x、y 或 z 的值为 1 时表示该人说的是真话。
值为 0 时表示该人说的是假话。
那么上面问题分析中的三个结论可以使用如下的表达式进行表示:
- x==1 and y==0 张三说的是真话,李四在说谎
- x==0 and y==1 张三在说谎,李四说的是真话
- y==1 and z==0 李四说的是真话,王五在说谎
- y==0 and z==1 李四在说谎,王五说的是真话
- z==1 and x==0 and y==0 王五说的是真话,则张三和李四两人就都在说谎
- z==0 and x+y!=0 王五在说谎,则张三和李四两人至少一人说的是真话
我们已经知道,在 Python 中,有了关系运算符和逻辑运算符以后,就可以使用一个逻辑表达式来表达一个复杂的关系。
将上面的表达式进行整理一下就得到如下表达式:
(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)
上面的每个条件之间都是 or(或)的关系。
好啦,现在只要画出盒图,就离搞定程序不远啦:
正确匹配中还需要加一个 if 语句判断来方便输出,核心代码:
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 == 1:
a = '真'
else:
a = '假'
if y == 1:
b = '真'
else:
b = '假'
if z == 1:
c = '真'
else:
c = '假'
print("张三说的是{}话".format(a))
print("李四说的是{}话".format(b))
print("王五说的是{}话".format(c))
结果:
搞定!
别急,以为下课了吗?!
没觉得上面代码中 if/else 有点冗余吗?
对于新手来说虽然上面的结构很易于理解,但是!
高阶程序员是不会这么写的,内行人一看就知道你还不够牛~
现在小师妹教给大家一种“高级”写法,只需执行一条语句就可以!
像这种:我们可以简化为:
一行代码搞定,是不是格调满满~
执行过程其实还和上面一样:
- 如果 x>0 条件为真,则条件表达式的值为 x,即 y=x
- 如果条件为假,则条件表达式的值为 -x,则 y=-x
代码就可以优化成这样:
a = '真' if x == 1 else'假'
b = '真' if y == 1 else'假'
c = '真' if z == 1 else'假'
好啦,下课!
源码(不推荐下载):
whoLie.py.zip
(717 Bytes, 下载次数: 16, 售价: 8 鱼币)
|