这是一道算是逻辑推理的题,是像考公的行策以及小学奥数里出现过的题目。我之前确实么想到居然可以用算法写出来,之前这类题都是脑子自然而然就推理出来了,好像也没想过具体步骤拆分来的话到底是是怎么回事。
这还是前段时间第一堂课上老师讲的一个例题,题目是这样的:
老师发现有人帮老师提前擦了黑板,便问了以下四名同学:
岳林姗说:不是我做的好事
林平之说:是任盈盈做的好事
任盈盈说:是令狐冲做的好事
令狐冲说:任盈盈说的是假话
以上同学只有一个人说了假话,请问好事是谁做的?
代码如下图:
name = ['岳林姗','林平之','任盈盈','令狐冲']
for i in range(0,3+1):
if ((i!=0)+(i==2)+(i==3)+(i!=3))==3:
print(f'做好事的同学是{name[i]}同学')
结果:
思考逻辑:
课堂上我脑子是一直没转过来的,因为计算机的这种思考角度跟我平时想这种题的时候的方向就不一样。它的逻辑是这样的:我们假设一个人说真话为1,说假话为0,那么既然最终有三个人说了真话,那么根据题意,四个人的话加起来的值就应该是3。
于是我们写一个for循环,其中i既代表第几轮循环,也代表做好事的人的编号,分别依次假设:
岳林姗做的好事(第一次循环,此时i=0)
林平之做的好事(第二次循环,此时i=1)
任盈盈做的好事(第三次循环,此时i=2)
令狐冲做的好事(第四次循环,此时i=3)
而if判断就是用来具体描述每个人讲话的内容:
假如i=0 (也就是在第一个循环里面,此时i代表岳林姗(0)):
i != 0 即为“不是岳林姗(0)做的好” --> 0!=0,判断为假,输出为0
i == 2 即为“是任盈盈(2)做的好事” --> 0==2,判断为假,输出为0
i == 3 即为“是令狐冲(3)做的好事” --> 0==3,判断为假,输出为0
i != 3 即为“任盈盈(2)说的是假话(即不是令狐冲做的好事)” --> 0!=3,判断为真,输出位1
这句话的值为0+0+0+1=1,而我们前面说过四个人的话加起来需要为3才符合题意,故第一个循环(i=0)——即“岳林姗做的好事”这个假设是不成立的。
假如i=1 (也就是在第二个循环里面,同时i=1也代表林平之):
i != 0 即为“不是岳林姗(0)做的好” --> 1!=0,判断为真,输出为1
i == 2 即为“是任盈盈(2)做的好事” --> 1==2,判断为假,输出为0
i == 3 即为“是令狐冲(3)做的好事” --> 1==3,判断为假,输出为0
i != 3 即为“任盈盈(2)说的是假话(即不是令狐冲做的好事)” --> 1!=3,判断为真,输出位1
这句话的值为1+0+0+1=2,也不符合题意,故第二个循环(i=1)——即“林平之做的好事”这个假设也不成立。
后面两轮循环的思考过程也是照搬前面两轮,有兴趣的同学可以自己演算一下(我一定不会告诉大家我是因为懒才没写完的)
感觉大家可能会疑惑的地方:
i 作为同学的编号的时候(也就是红字部分),就是单纯的符号作用,不具有计算意义,例如第一个循环里面我们假设了岳林姗(0)做的好事,但是岳林姗自己又说不是岳林姗做的好事(意思就是不等于0),n那么0不等于0这个东西就是矛盾的,是错误的,所以判断为假0 != 0
而蓝字和紫字部分的数字是具有计算含义的,会涉及到相加相减来根据他们的和来判断是否满足题意