1. 程式人生 > >誰是嫌疑犯問題Python列舉法

誰是嫌疑犯問題Python列舉法

問題描述:有6名犯罪嫌疑人A、B、C、D、E、F,已知如下事實:
A、B至少有1人作案;
A、E、F三人中至少有2人蔘與作案;
A、D不可能是同案犯;
B、C或同時作案,或與本案無關;
C、D中有且僅有1人作案;
如果D沒有參與作案,則E也不可能參與作案。請推理出誰作了案。

下面是人工邏輯推理:假設1:A參與作案,則
B可能參與作案(A、B至少有1人作案);
E、F至少有1人蔘與作案(A、E、F三人中至少有2人蔘與作案);
D未參與作案(A、D不可能是同案犯);
C參與作案(C、D中有且僅有1人作案);
B參與作案(B、C或同時作案,或與本案無關);
E未參與作案(如果D沒有參與作案,則E也不可能參與作案);
F參與作案(A、E、F三人中至少有2人蔘與作案),結果:A、B、C、F參與作案,D、E未參與作案。

假設2:A未參與作案,則
B參與作案(A、B至少有1人作案);
E、F參與作案(A、E、F三人中至少有2人蔘與作案);
C參與作案(B、C或同時作案,或與本案無關);
D未參與作案(C、D中有且僅有1人作案);
E未參與作案(如果D沒有參與作案,則E也不可能參與作案);
E既參與作案又未參與作案,出現矛盾,假設不成立;

下面是用Python處理的解題思路:用列舉法遍歷所有可能出現的罪犯組合,挑選出符合條件的。

suspects = ['A', 'B', 'C', 'D', 'E', 'F']
criminal_dict = {0: 'innocent', 1: 'guilty'}
n = 1

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 == 0) 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 "第%d種作案方案:" %(n)
                            print result
                            n = n + 1
print "\n總共有%d種作案方案" % (n-1)

結果截圖