谁是小偷
小区发生盗窃案,有四个人嫌疑最大,警察找来讯问。
A说:不是我。
B说:是C。
C说:是D。
D说:他冤枉人。
四人中有一人说了假话,编程分析谁是小偷。
此题主要考察抽象概括能力、逻辑思维能力和数据处理能力,将题目总结概括为数学问题是抽象概括能力,将数学问题剖析分解为运算公式为逻辑思维能力,将运算公式变换为Python程序为数据处理能力。
乍一看题目觉得高深莫测,但把题目分析拆解后会有一种“山重水复疑无路,柳暗花明又一村”的感觉。首先,根据题目描述分析可得:1)四人中有一人说了假话,说明A、B、C、D说的话中只有一人说的是假话,其他都是真话,三人的真话之间不能产生矛盾;2)有四个嫌疑人,只有一个小偷,说假话的一定是小偷。这是抽象概括能力。
四人中三人说的是真话,一人说的是假话,那么他们四个人的话加起来应该是:真+真+真+假,转换为逻辑语言就是True+True+True+False,也相当于1+1+1+0=3,此可作为判断谁是小偷的条件。接下来就是将四个人的话转换为对应的逻辑表达式。“A说:不是我”的意思是:“A说A不是小偷”,也就是“小偷不是A”,如果小偷是thief,那么转换为逻辑表达式就相当于“thief!=A”。“B说:是C”的意思是“B说小偷是C”,转换为逻辑表达式就相当于“thief==C”。“C说:是D”的意思是“C说小偷是D”,转换为逻辑表达式就相当于“thief==D”。“D说:他冤枉人”的意思是“D说C冤枉自己,自己不是小偷”,转换为逻辑表达式就相当于“thief!=D”。那么判断谁是小偷的问题就转换为了判断表达式(thief!=A)+(thief==C)+(thief==D)+(thief!=D)==3成立的条件问题,thief的取值范围是A、B、C、D中的一个。这是逻辑思维能力。
thief的取值范围是A、B、C、D中的一个,如何在Python中为thief规定取值范围,可以联想到ord()和chr()函数,ord('A')=65,ord('B')=66,ord('C')=67,ord('D')=68,chr(65)='A',chr(66)='B',chr(67)='C',chr(68)='D',可以使用range()函数为thief规定取值范围,程序编写如下:
for thief in range(65,69):
if ((thief!=65)+(thief==67)+(thief==68)+(thief!=68))==3:
thief=chr(thief+64)
print("小偷是{}".format(thief))
为了程序简便,也可将thief的取值范围改为range(1,5),修改后程序编写如下:
for thief in range(1,5):
if ((thief!=1)+(thief==3)+(thief==4)+(thief!=4))==3:
thief=chr(thief+64)
print("小偷是{}".format(thief))
结果都为