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

C語言解決邏輯推理題:跳水比賽排名與謀殺案兇手推理

     編輯:關於C語言

C語言解決邏輯推理題:跳水比賽排名與謀殺案兇手推理

利用窮舉法(暴力搜索)讓電腦解決經典邏輯謎題,展示程式化思維。

題目一:5 人跳水比賽排名

每人說兩句話,一真一假。窮舉 5! = 120 種排列,檢查每種是否滿足所有條件。

#include <stdio.h>
int main() {
    for (int a=1; a<=5; a++)
    for (int b=1; b<=5; b++)
    for (int c=1; c<=5; c++)
    for (int d=1; d<=5; d++)
    for (int e=1; e<=5; e++) {
        // 排列去重
        if (a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e) continue;
        // 每人一真一假:條件和為1
        if ( (b==1)+(a==3)==1 &&
             (b==2)+(e==4)==1 &&
             (c==1)+(d==2)==1 &&
             (c==5)+(d==3)==1 &&
             (e==4)+(a==1)==1 ) {
            printf("A:%d B:%d C:%d D:%d E:%d\n",a,b,c,d,e);
        }
    }
    return 0;
}

輸出唯一解:A:2 B:1 C:5 D:3 E:4

題目二:4 嫌疑犯謀殺案

3 人說真話,1 人說謊。窮舉兇手為 a/b/c/d 四種情況。

#include <stdio.h>
int main() {
    for (char k='a'; k<='d'; k++) {
        // A:不是我(k!='a'), B:是C(k=='c'), C:是D(k=='d'), D:C胡說(k!='d')
        int truths = (k!='a') + (k=='c') + (k=='d') + (k!='d');
        if (truths == 3) printf("兇手是 %c\n", k);
    }
    return 0;
}

輸出:兇手是 b

方法論總結

  1. 狀態空間窮舉:用巢狀迴圈或遞歸列出所有可能分配。
  2. 條件編碼:將邏輯語句轉為布爾表達式(真=1,假=0),利用算術運算組合(+ 計數真值,&& 全真)。
  3. 剪枝優化:題目一中先檢查排列去重,大幅減少無效迭代。

這類題目核心在於「將自然語言邏輯形式化為可計算的布爾表達式」,再交給電腦窮舉驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved