某地刑侦大队已经掌握以下线索:
A
,B
至少有一人作案;A
,E
,F
三人中至少有两人参与作案;A
,D
不可能是同案犯;B
,C
或同时作案,或与本案无关;C
,D
中有且仅有一人作案;- 如果
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 与 B
。A || B
表示逻辑A 或 B
。!A
表示逻辑非A
:
A
,B
至少有一人作案 ——A||B
。A
,E
,F
三人中至少有两人参与作案 ——(A&&E)||(A&&F)||(E&&F)
。A
,D
不可能是同案犯 ——!(A&&D)
。B
,C
或同时作案,或与本案无关 ——(B&&C)||(!B&&!C)
。C
,D
中有且仅有一人作案 ——(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;
}