邏輯推理類問題:窮舉法+關系與邏輯運算符 綜合運用
1. 新郎和新娘
三對情侶參加婚礼,三個新郞為A、B、C,三個新娘為X、Y、Z。有人不知道誰和誰結婚,于是詢問了六位新人中的三位,但聽到的回答是這樣的:A說他將和X結婚;X說她的未婚夫是C;C說他將和Z結婚。這人聽后知道他們在開玩笑,全是假話。請編程找出誰將和誰結婚。
【分析】可設三個新郎為x, y, z,窮舉所有情況;
根據(jù)三句假話可推斷:x!='A' x!='C' z!='C',且根據(jù)ABC與XYZ的一一對應關系可知x!=y y!=z x!=z。這些條件需同時成立。
源代碼:
#include <stdio.h>int main(){ char x,y,z; //xyz分別為與新娘XYZ結婚的新郎 for(x='A';x<='C';x++) //三重循環(huán)窮舉所有可能情況 { for(y='A';y<='C';y++) { for(z='A';z<='C' && x!=y;z++) { if(x!='A' && x!='C' && z!='C' && x!=z && y!=z) //三句假話+一個新郎只能與一個新娘結婚 PRintf("%c-%c %c-%c %c-%c/n",x,'X',y,'Y',z,'Z'); } } } return 0;}程序截圖:
2. 誰在說謊?
現(xiàn)有張三、李四和王五三個人:
張三說李四在說謊,
李四說王五在說謊,
而王五說張三和李四兩人都在說謊,
要求編程求出這3個人中到底誰說的是真話,誰說的是假話。
【分析】 題中邏輯條件:由于不知道三個人說的真與假,故有以下幾種可能情況:
1. 張三真李四假或 張三假李四真(互反)
2. 李四真王五假或 李四假王五真(互反)
3. 王五真、張三李四均假 或 王五假、張三李四一真一假
可設i, j, k分別為張三、李四、王五,真假分別用1和0表示,枚舉所有可能情況。
源代碼:
#include <stdio.h>int main(){ int i,j,k; //i-張三 j-李四 k-王五 for(i=0;i<=1;i++) //1真0假 { for(j=0;j<=1;j++) { for(k=0;k<=1;k++) { if(((i&&!j)||(!i&&j)) && ((j&&!k)||(!j&&k)) && ((k&&!i&&!j) || !k&&(i+j!=0))) { printf("張三說的是%s/n",i?"真話":"假話"); printf("李四說的是%s/n",j?"真話":"假話"); printf("王五說的是%s/n",k?"真話":"假話"); } } } } return 0;}程序截圖:
3. 誰是竊贼
警察審問四名竊贼嫌疑犯。已知,這四人當中僅有一名是竊贼,還知道這四個人中每人要么是誠實的,要么總是說謊。他們給警察的回答是: 甲說:“乙沒有偷,是丁偷的” ; 乙說:“我沒有偷,是丙偷的” ; 丙說:“甲沒有偷,是乙偷的”; 丁說:“我沒有偷”。
請編寫程序,根據(jù)這四個人的回答判斷誰是竊贼。
【分析】可用變量ABCD分別代表甲乙丙丁四人,1和0分別代表該日是/不是竊贼,則可得出以下條件:
B+D=1,B+C=1,A+B=1,A+B+C+D=1;
由于甲乙丙三人的話中都提到了兩個人,其中必有一人是小偷,所以在根據(jù)他們的話列出條件表達式時可不必關心誰說的是真話誰說的是假話(丁的話陳述了一個“客觀條件”即四人中有僅有一名是竊贼,故無法判斷真假);
可依次設ABCD為竊贼,代入前三個表達式相與后的表達式依次檢驗。
源代碼:
#include <stdio.h>int main(){ int i; int A=1,B=0,C=0,D=0; //假定A為竊賊(1000) for(i=1;i<=4;i++) { if(B+D==1 && B+C==1 && A+B==1) break; else { if(i==1) //甲不是竊賊,測試乙是否是竊賊(0100) A=0,B=1; if(i==2) //甲乙都不是竊賊,測試丙是否是竊賊(0010) B=0,C=1; if(i==3) //甲乙丙都不是竊賊,測試丁是否是竊賊(0001) C=0,D=1; } } if(i==1) printf("甲是竊賊/n"); if(i==2) printf("乙是竊賊/n"); if(i==3) printf("丙是竊賊/n"); if(i==4) printf("丁是竊賊/n"); return 0;}程序截圖:
4. 委派任務
某偵察隊接到一項緊急任務,要求在A、B、C、D、E、F六個隊員中盡可能多地挑若干人,但有以下限制條件: (1)A和B兩人中至少去一人; (2)A和D不能一起去; (3)A、E和F三人中要派兩人去; (4)B和C都去或都不去; (5)C和D兩人中只能去一個; (6)若D不去,則E也不去。 問應當讓哪幾個人去?
【分析】可用ABCDEF 6個變量分別表示這6個人,某個人被選定去完成任務對應1,否則對應0,因此可得以下6個表達式:
A+B>=1,A+D!=2,A+E+F==2,B+C==0 || B+C==2(都去2,都不去0),C+D==1,D+E==0 || D==1(DE都不去 或 D去,E去不去均可)
聯(lián)立求解即可。
源代碼:
#include <stdio.h>int main(){ int A,B,C,D,E,F; for(A=0;A<=1;A++) { for(B=0;B<=1;B++) { for(C=0;C<=1;C++) { for(D=0;D<=1;D++) { for(E=0;E<=1;E++) { for(F=0;F<=1;F++) { if(A+B>=1 && A+D!=2 && A+E+F==2 && (B+C==0||B+C==2) && C+D==1 && (D+E==0||D==1)) { printf("A%s被選擇去完成任務/n",A?"":"未"); printf("B%s被選擇去完成任務/n",B?"":"未"); printf("C%s被選擇去完成任務/n",C?"":"未"); printf("D%s被選擇去完成任務/n",D?"":"未"); printf("E%s被選擇去完成任務/n",E?"":"未"); printf("F%s被選擇去完成任務/n",F?"":"未"); } } } } } } } return 0;}程序截圖:
新聞熱點
疑難解答