@疑案求解
分别用循环和位运算解决
#include<stdio.h>
#include<string.h>
/*
---------------------------------------------
六个嫌疑人,找出作案人。
1)A和B至少有一个人作案
2)A和D不可能是同案犯
3)A E F至少有两人参与作案
4)B C或同时作案,或与本案无关
5)C D中有且只有一人作案
6)如果D没有作案,则E也不能参与作案
--------------------------------------------
*/
void sol1(char (*)[9]);//六重循环
void sol2(char(*)[9]);//位运算
void main()
{
char str[2][9] = { "没有作案", "作案" };
sol2(str);
}
void sol1(char (*str)[9])
{
int t1, t2, t3, t4, t5, t6;
int T;
int A, B, C, D, E, F;//代表嫌疑人
for (A = 0; A <= 1; A++)//A=1为作案
{
for (B = 0; B <= 1; B++)
{
for (C = 0; C <= 1; C ++ )
{
for (D = 0; D <= 1; D++)
{
for (E = 0; E <= 1; E++)
{
for (F = 0; F <= 1;F++)
{
t1 = A||B;
t2 = !(A&&D);
t3 = (A&&E) || (A&&F) || (F&&E);
t4 = (B&&C) || (!B&&!C);
t5 = (D&&!C) || (!D&&C);
//t6 =D||(!E)
t6 = (!D&&!E) || (D&&E) || (D&&!E);
T = t1 + t2 + t3 + t4 + t5 + t6;
if (T == 6)
{
printf_s("A : %s \n", str[A]);
printf_s("B : %s \n", str[B]);
printf_s("C : %s \n", str[C]);
printf_s("D : %s \n", str[D]);
printf_s("E : %s \n", str[E]);
printf_s("F : %s \n", str[F]);
}
}
}
}
}
}
}
}
void sol2(char(*str)[9])
{
int t1, t2, t3, t4, t5, t6;
int T;
int A, B, C, D, E, F;//代表嫌疑人,把他们看成二进制的位,F位最低位
for (int i = 0; i <= 63; i++)//2的六次方个排列数
{
F = (i & 1);
E = (i & 2) >> 1;
D = (i & 4) >> 2;
C = (i & 8) >> 3;
B = (i & 16) >> 4;
A = (i & 32) >> 5;
t1 = A || B;
t2 = !(A&&D);
t3 = (A&&E) || (A&&F) || (F&&E);
t4 = (B&&C) || (!B&&!C);
t5 = (D&&!C) || (!D&&C);
//t6 =D||(!E)
t6 = (!D&&!E) || (D&&E) || (D&&!E);
T = t1 + t2 + t3 + t4 + t5 + t6;
if (T == 6)
{
printf_s("A : %s \n", str[A]);
printf_s("B : %s \n", str[B]);
printf_s("C : %s \n", str[C]);
printf_s("D : %s \n", str[D]);
printf_s("E : %s \n", str[E]);
printf_s("F : %s \n", str[F]);
}
}
}