C趣味程序百例(16)黑與白

字號:

52.黑與白
     有A、B、C、D、E五人,每人額頭上都帖了一張黑或白的紙。五人對坐,每人都可以看到其它人額頭上的紙的顏色。五人相互觀察后,
     A說:“我看見有三人額頭上帖的是白紙,一人額頭上帖的是黑紙?!?BR>     B說:“我看見其它四人額頭上帖的都是黑紙?!?BR>     C說:“我看見一人額頭上帖的是白紙,其它三人額頭上帖的是黑紙?!?BR>     D說:“我看見四人額頭上帖的都是白紙?!?BR>     E什么也沒說。
     現(xiàn)在已知額頭上帖黑紙的人說的都是謊話,額頭帖白紙的人說的都是實話。問這五人誰的額頭是帖白紙,誰的額頭是帖黑紙?
    *問題分析與算法設計
     假如變量A、B、C、D、E表示每個人額頭上所帖紙的顏色,0 代表是黑色,1 代表是白色。根據(jù)題目中A、B、C、D四人所說的話可以總結(jié)出下列關(guān)系:
     A說: a&&b+c+d+e==3||!a&&b+c+d+e!=3
     B說: b&&a+c+d+e==0||!b&&a+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
     窮舉每個人額頭所帖紙的顏色的所有可能的情況,代入上述表達式中進行推理運算,使上述表達式為“真”的情況就是正確的結(jié)果。
    *程序與程序注釋
    #include
    void main()
    {
     int a,b,c,d,e;
     for(a=0;a<=1;a++) /*黑色:0 白色:1*/
     for(b=0;b<=1;b++) /*窮舉五個人額頭帖紙的全部可能*/
     for(c=0;c<=1;c++)
     for(d=0;d<=1;d++)
     for(e=0;e<=1;e++)
     if((a&&b+c+d+e==3||!a&&b+c+d+e!=3)
     &&(b&&a+c+d+e==0||!b&&a+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))
     {
     printf("A is pasted a piece of %s paper on his forehead.\n",
     a?"white":"black");
     printf("B is pasted a piece of %s paper on his forehead.\n",
     b?"white":"black");
     printf("C is pasted a piece of %s paper on his forehead.\n",
     c?"white":"black");
     printf("D is pasted a piece of %s paper on his forehead.\n",
     d?"white":"black");
     printf("E is pasted a piece of %s paper on his forehead.\n",
     e?"white":"black");
     }
    }
    *運行結(jié)果
     A is pasted a paper of black paper on his forehead. (黑)
     B is pasted a paper of black paper on his forehead. (黑)
     C is pasted a paper of white paper on his forehead. (白)
     D is pasted a paper of black paper on his forehead. (黑)
     E is pasted a paper of white paper on his forehead. (白)