刑警破案问题

某地刑侦大队已经掌握以下线索:

  • AB至少有一人作案;
  • AEF三人中至少有两人参与作案;
  • AD不可能是同案犯;
  • BC或同时作案,或与本案无关;
  • CD中有且仅有一人作案;
  • 如果D没有参与作案,则E也不可能参与作案;

请你写一个程序,帮助警察从6个人中找出作案人。

问题分析

这个问题与上一个问题类似,但这一个问题中,作案人不一定只有一个,所以这里我们采用穷举组合情况的办法。我们可以找出所有的作案人的组合情况,然后再与线索进行比对,看看是否满足条件。

这与《百元买百鸡》的问题的思想相似,创建A B C D E F六个变量,分别对应六个人。如果对应变量为0,则认为这个人是普通人;是1则认为是作案人。

代码如下:

for(int A = 0;A <= 1;A=A+1) //每一个变量的取值范围都是0到1
 for(int B = 0;B <= 1;B=B+1)
  for(int C = 0;C <= 1;C=C+1)
   for(int D = 0;D <= 1;D=D+1)
    for(int E = 0;E <= 1;E=E+1)
     for(int F = 0;F <= 1;F=F+1)
     {
     }

接着我们用逻辑运算符来表示线索。在C语言中A && B表示逻辑A 与 BA || B表示逻辑A 或 B!A表示逻辑非A

  • AB至少有一人作案 —— A||B
  • AEF三人中至少有两人参与作案 —— (A&&E)||(A&&F)||(E&&F)
  • AD不可能是同案犯 —— !(A&&D)
  • BC或同时作案,或与本案无关 —— (B&&C)||(!B&&!C)
  • CD中有且仅有一人作案 —— (C&!D)||(!C&&D)
  • 如果D没有参与作案,则E也不可能参与作案 —— !D&&!E

然后将这6条表达式的结果加起来,等于6时则代表线索都满足了,这个时候输出每个变量的取值情况就找到了作案人:

if ((A||B) + 
    ((A&&E)||(A&&F)||(E&&F)) +
    !(A&&D) +
    ((B&&C)||(!B&&!C)) +
    ((C&!D)||(!C&&D)) +
    (!D&&!E) == 6)
    {
        cout << "作案人:";
        if(A == 1) cout <<"A";
        if(B == 1) cout <<"B";
        if(C == 1) cout <<"C";
        if(D == 1) cout <<"D";
        if(E == 1) cout <<"E";
        if(F == 1) cout <<"F";
        cout << endl;
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值