本文主要是介绍诚实国还是说谎国,谁说假话,谁说实话,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们看一个非常有意思的小问题。
题目:
城实国和说谎国,是两个截然不同的国家。诚实国的人永远说真话,说谎国的人永远说假话。
有一天,你在两个国家的交界处遇到了三个人A,B,C,你想调查一下他们分别来自哪个国家。
其中A说“我们三个人中间有两个来自诚实国”。
B说“他说的不对,我们中间只有一个城实国”。
最后C告诉你:B说的对。
请问:你该怎样分辨出他们的国籍?
如果我们不用程序模拟,很快我们就要被搞晕了。大家可能不相信,公务员考试就有很多这样的题目。令人崩溃。
但是......
作为一个学过python的程序员(媛),我们可以尝试一下 ,用python计算出这个问题。
代码获取
关注“python趣味爱好者”微信公众号,回复“谁在说谎”获取源代码
算法模拟
1:循环遍历
我们写程序看一看吧
我们用1表示一个人是城实国,0表示这个人来自说谎国。
我们用a,b,c三个变量来表示这三个人的国籍,比如说a=1.代表A来自诚实国。
b=0,代表B来自说谎国。
我们先初始化三个变量。
a=0
b=0
c=0
然后,我们用穷举法循环所有的可能性
代码如下
for i in range(0,2):a=ifor j in range(0,2):b=jfor k in range(0,2):c=kprint("A的国籍",a," B的国籍",b," C的国籍",c)
遍历所有可能的结果,是这样的
这样,我们就可以将所有的人的身份状态遍历一遍。一共有八种情况。
2:条件判断
在这些各种情况中,我们要找出符合三个人说的要求的图片。为此,我们专门定义了一个函数。用来判断是否符合三种要求。
def judge(a,b,c):if((a and a+b+c==2) or ((not a) and a+b+c!=2)) and ((b and a+b+c==1) or ((not b) and a+b+c!=1)) and (c and a+b+c==1) or ((not c) and a+b+c!=1):return 1else:return 0
其中a,b,c是三个形参,分别代表三个人的国籍。
然后,我们用了一个比较复杂的if判断。先假设
除此之外,我们还要定义一个函数,来判断当前的身份状态是否符合题目中的要求,也就是这三个人说的话。
大家仔细阅读一下这一行代码,这是用来描述A说的话的。
((a and a+b+c==2) or ((not a) and a+b+c!=2))
A说他们之间有两个人来自诚实国,那么如果A说的是正确的,那么他就来自诚实国,另外两个人中也有一个来自诚实国,也就是a+b+c=2。其中a=1,b,c之间有一个是1有一个是0。
如果A说的是错的,那么a=0,且a+b+c不等于2。
我们再来看B说的话,B说他们之间只有一个来自诚实国,加入B说的是正确的,那么A说的就是错的。也就是说a=0,b=1,这时候c=0.
同样的道理分析C,我们也可以看出其中的规律,我们把这些约束写在if判断里面。如果满足所有的条件,那么就返回1,否则返回0.
在循环遍历所有的情况的时候,我们调用这个函数,进行判断。
运行结果就是
有两种情况满足
第一种是:
A,B,C说的全部都是谎话,他们都来自说谎国
第二种是:
A和B来自诚实国,C来自说谎国
图片来源:
图怪兽
发表情
这篇关于诚实国还是说谎国,谁说假话,谁说实话的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!