问题形容
有 A、B、C、D、E 这 5 集体,每个人额头上都帖了一张黑或白的纸。5 人对坐,每 集体都能够看到其他人额头上纸的色彩。5 人互相察看后:
A 说:“我看见有 3 人额头上贴的是白纸,1 人额头上贴的是黑纸。”B 说:“我看见其余 4 人额头上贴的都是黑纸。”C 说:“我看见 1 人额头上贴的是白纸,其余 3 人额头上贴的是黑纸。”D 说:“我看见 4 人额头上贴的都是白纸。”E 什么也没说。
当初己知额头上贴黑纸的人说的都是谎言,额头贴白纸的人说的都是瞎话。问这 5 人 谁的额头上贴的是白纸,谁的额头上贴的是黑纸?
思路:
因为题目开端介绍贴黑纸的就是贴谎言,贴白纸的就是瞎话。因而,咱们将 5 集体的话翻译过去,那就是:
A:“3 人瞎话,1 人谎言。”B:“4 人谎言”C:“1 人瞎话,3 人谎言。”D:“4 人瞎话”E 不发言。
用表达式进一步示意(0 为扯谎,1 为诚恳),则有:
如果 a 的话为真,则:a&&b+c+d+e==3
否则:!a&&b+c+d+e!=3
其余亦然(思考文本无限,不再过多表述)。
因而,本题我采纳穷举法的思路实现。
#include<stdio.h>
int main()
{
int a, b, c, d, e; /* 0 示意彩色,1 示意红色 */
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++)
//* 条件输出
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 额头上的贴纸是 %s 色的.\n",a?"白":"黑");
printf("B 额头上的贴纸是 %s 色的.\n",b?"白":"黑");
printf("C 额头上的贴纸是 %s 色的.\n",c?"白":"黑");
printf("D 额头上的贴纸是 %s 色的.\n",d?"白":"黑");
printf("E 额头上的贴纸是 %s 色的.\n",e?"白":"黑");
}
return 0;
}
即本题后果为:
A 额头上的贴纸是彩色的.
B 额头上的贴纸是彩色的.
C 额头上的贴纸是红色的.
D 额头上的贴纸是彩色的.
E 额头上的贴纸是红色的.