今日闲翻小学数学书,看到一个比较有意思的逻辑问题。刚好在学C,故写此代码。
原题:警察抓住了4个偷东西的嫌疑人,其中的一个人是主谋。审问谁是主谋时,甲说:我不是主谋。乙说:丁是主谋。丙说:我不是主谋。丁说:甲是主谋。已知他们4人中只有一个人说了真话。主谋是谁?
1 #include <stdio.h> 2 #include <stdbool.h> 3 4 int main() 5 { 6 // 假设 A、B、C、D 分别表示甲、乙、丙、丁,M 表示主谋 7 bool A, B, C, D, M; 8 9 // 遍历所有可能的情况,共有 16 种 10 for (int i = 1; i < 16; i*=2) 11 { 12 // 用二进制位来表示每个人是否是主谋 13 A = i & 1; 14 B = i & 2; 15 C = i & 4; 16 D = i & 8; 17 M = A || B || C || D; // 主谋必须是四个人中的一个 18 19 // 判断每个人的说法是否为真 20 bool A_says = (A != M); 21 bool B_says = (D == M); 22 bool C_says = (C != M); 23 bool D_says = (A == M); 24 25 26 27 if (A_says && !B_says && !C_says && !D_says) { 28 printf("甲说的是真话:"); 29 break; 30 } 31 if (!A_says && B_says && !C_says && !D_says) { 32 printf("乙说的是真话:"); 33 break; 34 } 35 if (!A_says && !B_says && C_says && !D_says) { 36 printf("丙说的是真话:"); 37 break; 38 } 39 if (!A_says && !B_says && !C_says && D_says) { 40 printf("丁说的是真话:"); 41 break; 42 } 43 44 } 45 int result = A * 8 + B * 4 + C * 2 + D;//利用加法运算符将4个Bool变量组合。 46 switch (result) { 47 case 8: printf("甲是凶手!"); break; 48 case 4: printf("乙是凶手!"); break; 49 case 2: printf("丙是凶手!"); break; 50 case 1: printf("丁是凶手!"); break; 51 } 52 }