某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
1.A、B 至少有一人作案;
2.A、E、F 三人中至少有两人参与作案;
3.A、D 不可能是同案犯;
4.B、C 或同时作案,或与本案无关;
5.C、D 中有且仅有一人作案;
6.如果 D 没有参与作案,则 E 也不可能参与作案。
/*
谁是犯罪嫌疑人
*/
#include<iostream>
using namespace std;
int main() {
int A, B, C, D, E, F;
//由于题目中涉及了六个犯罪嫌疑人,所以如果再对A,B,C,D,E,F嵌套六次for循环的话就会显得很冗长
for (int i = 0; i < 64; i++)/*这里是用i表示所有的情况,二进制中每一位的0或1就表示某人是否犯罪*/
{
F = i & 1;//这里是按位与运算,目的是提取出二进制的最低位
E = (i & 2) >> 1;//i与2按位与运算后再右移1位,提取出二进制的从右往左数第二位
D = (i & 4) >> 2;//一定要记得加括号!!!
C = (i & 8) >> 3;
B = (i & 16) >> 4;
A = (i & 32) >> 5;//至此我们假设了每一个嫌疑人的犯罪情况,1表示犯罪,0表示未犯罪
//题目中给出了六句话,即六句话都为真。我们只要把这六句话相与,如果值为1就得到了结果
bool s1, s2, s3, s4,s5,s6;
s1 = A || B;//或运算,若值为1则表示A,B中至少有一人犯罪
s2 = !(A && D);//非运算,与运算,表示A,D不为同案犯
s3 = (A && E) || (A && F) || (E && F);//A,E,F中至少有两人作案
s4 = (B&&C)||(!B&&!C);//同或运算,B,C要么同案,要么无关
s5 = (C && !D) || (!C && D);//C,D有且仅有一人参加
s6 = D || (!D && !E);//最好是列真值表,把所有s6为1的情况进行或运算
if(s1&&s2&&s3&&s4&&s5&&s6)
{
cout << "A" << (A == 1 ? "是" : "不是" )<< "罪犯"<<endl;
cout << "B" << (B == 1 ? "是" : "不是") << "罪犯" << endl;
cout << "C" << (C == 1 ? "是" : "不是") << "罪犯" << endl;
cout << "D" << (D == 1 ? "是" : "不是") << "罪犯" << endl;
cout << "E" << (E == 1 ? "是" : "不是") << "罪犯" << endl;
cout << "F" << (F == 1 ? "是" : "不是") << "罪犯" << endl;
/*这边运用了三目运算符的相关知识*/
}
}
return 0;
}