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. (白)
有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. (白)

