zoukankan      html  css  js  c++  java
  • 谁是嫌疑犯问题Python枚举法

    原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 

    问题描述:有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(a,b,c,d,e,f)
                     print ("第%d种作案方案:" %(n))
                     print(list(result))
                     n = n + 1
    print("总共有%d种作案方案" %(n-1))

      



  • 相关阅读:
    CF431E Chemistry Experiment
    BZOJ 4173: 数学
    BZOJ 2426: [HAOI2010]工厂选址
    BZOJ 2580: [Usaco2012 Jan]Video Game
    BZOJ 4237: 稻草人
    BZOJ 2434: [Noi2011]阿狸的打字机
    BZOJ 3881: [Coci2015]Divljak
    BZOJ 2754: [SCOI2012]喵星球上的点名
    BZOJ 1009: [HNOI2008]GT考试
    BZOJ 3731: Gty的超级妹子树
  • 原文地址:https://www.cnblogs.com/vanoraxnc/p/10388000.html
Copyright © 2011-2022 走看看