关于算法:额头上的贴纸问题

48次阅读

共计 1008 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0