问题形容
有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额头上的贴纸是红色的.