问题描述:
有6名犯罪嫌疑人A、B、C、D、E、F,已知如下事实:
A、B至少有1人作案;
A、E、F三人中至少有2人参与作案;
A、D不可能是同案犯;
B、C或同时作案,或与本案无关;
C、D中有且仅有1人作案;
如果D没有参与作案,则E也不可能参与作案。请推理出谁作了案。
此题为多人作案(也可能仅一个作案),每人都有作案(1)和不作案(0)两种情况,枚举各人是否作案,再用“事实”来判定是否符合事实,如符合则输出作案人。
解题思路:
此题关键是怎样将文字描述的“事实”转变为计算机可能处理的条件式,同时满足题目给出的六条“事实”。
如果用0表示不参与作案(简称不作案),1表示参与作案(简称作案),则:
第1条事实:A+B≥1;至少1人作案
第2条事实:A+B+F≥2;至少2人作案
第3条事实:A*D=0,或A+D≤1;不可能是同案犯
第4条事实:B=C;B作案C也作案,B不作案C也不作案,
第5条事实:C+D=1;有且仅有1人作案,即1人作案,另1人不作案
第6条事实:D≥E;只要D不作案,E也不作案
下面是用枚举法遍历所有可能出现的罪犯组合,挑选出符合条件的组合。
完整程序如下:
'''问题描述:有6名犯罪嫌疑人A、B、C、D、E、F,已知如下事实:
A、B至少有1人作案;
A、E、F三人中至少有2人参与作案;
A、D不可能是同案犯;
B、C或同时作案,或与本案无关;
C、D中有且仅有1人作案;
如果D没有参与作案,则E也不可能参与作案。请推理出谁作了案。
'''
suspects = ['A', 'B', 'C', 'D', 'E', 'F']
criminal_dict = {0: '未参与作案', 1: '参与作案'}
n = 0
for a in range(0, 2):for b in range(0,2):for c in range(0,2):for d in range(0,2):for e in range(0,2):for f in range(0,2):if (a + b >= 1) and (a + e + f >= 2) and (a + d <= 1) \and (b == c) and (c + d == 1) and (d >= e):result = zip(suspects, [criminal_dict[a],criminal_dict[b], criminal_dict[c],criminal_dict[d], criminal_dict[e],criminal_dict[f]])print(f'第{n+1}种作案方案:')for i in result:print(f'{i[0]}: {i[1]}')n = n + 1
print(f'\n总共有{n}种作案方案。')
运行结果: