利用窮舉法(暴力搜索)讓電腦解決經典邏輯謎題,展示程式化思維。
每人說兩句話,一真一假。窮舉 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
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
+ 計數真值,&& 全真)。這類題目核心在於「將自然語言邏輯形式化為可計算的布爾表達式」,再交給電腦窮舉驗證。