日本謀殺案,4 嫌疑人供詞:
已知 3 人說真話,1 人說謊。編程找出兇手。
設兇手為 killer('a'~'d')。每人陳述的真值:
真話總數 = 3。
#include <stdio.h>
int main() {
for (char killer = 'a'; killer <= 'd'; killer++) {
int truths = 0;
truths += (killer != 'a'); // A
truths += (killer == 'c'); // B
truths += (killer == 'd'); // C
truths += (killer != 'd'); // D
if (truths == 3) {
printf("兇手是:%c\n", killer);
}
}
return 0;
}
兇手是:c
| 人 | 陳述 | 真值 | 說明 |
|---|---|---|---|
| A | 不是我 | 真 | 兇手是 C,非 A |
| B | 是 C | 真 | 兇手確實是 C |
| C | 是 D | 假 | 兇手是 C,非 D |
| D | C 在胡說 | 真 | C 確實說謊 |
真話 3 句,假話 1 句,符合條件。
// 定義嫌疑人結構
typedef struct {
char name;
int (*statement)(char killer); // 陳述函數,返回真假
} Suspect;
int stmt_A(char k) { return k != 'a'; }
int stmt_B(char k) { return k == 'c'; }
int stmt_C(char k) { return k == 'd'; }
int stmt_D(char k) { return k != 'd'; } // C 說謊
Suspect suspects[] = {
{'A', stmt_A}, {'B', stmt_B}, {'C', stmt_C}, {'D', stmt_D}
};
void solve(int n, int true_count) {
for (char k = 'a'; k < 'a'+n; k++) {
int truths = 0;
for (int i = 0; i < n; i++) truths += suspects[i].statement(k);
if (truths == true_count) printf("兇手:%c\n", k);
}
}