逻辑表达式——黑纸白纸
一、問題描述
有A、B、C、D、E五個人,每人額頭上都貼了一張黑色或白色的紙條。五人對坐,每人都可以看到其他人額頭上的紙的顏色,但都不知道自己額頭上的紙的顏色。五人互相觀察后,
A說:“我看見有三個人額頭上貼的是白紙,一個人額頭上貼的是黑紙。”
B說:“我看見其他四個人額頭上貼的都是黑紙。”
C說:“我看見有一個人額頭上貼的是白紙,其他三個人額頭上貼的是黑紙。”
D說:“我看見四個人額頭上貼的都是白紙。”
E說:“我不發表觀點。”
現在一直額頭上貼黑紙的人說的都是謊話,額頭上貼白紙的人說的都是實話,問這五個人誰的額頭上貼的是白紙,誰的額頭上貼的是黑紙。
二、算法思想
需要窮舉出每個人額頭上所貼紙的顏色,假設0表示黑色,1表示白色。然后按照題意列出A、B、C、D四個人所說的話對應的邏輯表達式,并判斷所列條件是否成立,成立則輸出所貼的紙張顏色即可。依據題意列出額的邏輯表達式為:
A: ?(a && b+c+d+e==3) || (!a && b+c+d+e!=3)
B: ?(b && a+c+d+e==0) || (!b && b+c+d+e!=0)
C: ?(c && a+b+d+e==1) || (!c && a+b+d+e!=1)
D: ?(d && a+b+c+e==4) || (!d && a+b+c+e!=4)
具體的操作利用循環解決問題,設置多重循環,依次窮舉出五人貼白紙和黑紙的所有可能,再用條件語句進行判斷,其條件表達式為(注意各個括號覆蓋范圍):
((a && b+c+d+e==3) || (!a && b+c+d+e!=3)) && ((b && a+c+d+e==0) || (!b && b+c+d+e!=0)) && ((c && a+b+d+e==1) || (!c && a+b+d+e!=1)) && ((d && a+b+c+e==4) || (!d && a+b+c+e!=4))
三、程序代碼
1 #include <stdio.h> 2 3 int main(){ 4 int a, b, c, d, e; 5 for(a=0; a<=1; a++){ 6 for(b=0; b<=1; b++){ 7 for(c=0; c<=1; c++){ 8 for(d=0; d<=1; d++){ 9 for(e=0; e<=1; e++){ 10 if( ((a && b+c+d+e==3) || (!a && b+c+d+e!=3)) && ((b && a+c+d+e==0) || (!b && b+c+d+e!=0)) && ((c && a+b+d+e==1) || (!c && a+b+d+e!=1)) && ((d && a+b+c+e==4) || (!d && a+b+c+e!=4)) ){ 11 printf("0-黑紙\t1-白紙\n\n"); 12 printf(" a是%d\n b是%d\n c是%d\n d是%d\n e是%d\n", a, b, c, d, e); 13 } 14 } 15 } 16 } 17 } 18 } 19 return 0; 20 }四、運行結果
?
轉載于:https://www.cnblogs.com/IronLavender/p/6814301.html
總結
以上是生活随笔為你收集整理的逻辑表达式——黑纸白纸的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两张表的笛卡尔积用sql语句
- 下一篇: node源码详解(五)