首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言邏輯推理:誰是兇手(4 嫌疑人、3 真 1 假)

     編輯:關於C語言

C語言邏輯推理:誰是兇手(4 嫌疑人、3 真 1 假)

日本謀殺案,4 嫌疑人供詞:

  • A:不是我
  • B:是 C
  • C:是 D
  • D:C 在胡說(即 C 說謊)

已知 3 人說真話,1 人說謊。編程找出兇手。

邏輯建模

設兇手為 killer('a'~'d')。每人陳述的真值:

  • A 真 ⇔ killer ≠ 'a'
  • B 真 ⇔ killer == 'c'
  • C 真 ⇔ killer == 'd'
  • D 真 ⇔ C 說謊 ⇔ killer ≠ '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

邏輯驗證(killer = 'c')

人陳述真值說明
A不是我真兇手是 C,非 A
B是 C真兇手確實是 C
C是 D假兇手是 C,非 D
DC 在胡說真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);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved