手机版
你好,游客 登录 注册
背景:
阅读新闻

C语言黑与白问题代码及解析

[日期:2018-11-30] 来源:Linux社区  作者:Linux [字体: ]

问题描述

有A、B、C、D、E这5个人,每个人额头上都帖了一张黑或白的纸。5人对坐,每 个人都可以看到其他人额头上纸的颜色。5人相互观察后:

  • A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑纸。”
  • B说:“我看见其他4人额头上贴的都是黑纸。”
  • C说:“我看见1人额头上贴的是白纸,其他3人额头上贴的是黑纸 。”
  • D说:“我看见4人额头上贴的都是白纸。”
  • E什么也没说。

现在己知额头上贴黑纸的人说的都是谎话,额头贴白纸的人说的都是实话。问这5人 谁的额头上贴的是白纸,谁的额头上贴的是黑纸?

问题分析

该问题是一个逻辑推理问题。分析A、B、C、D这4个人所说的话可以得出4个条件。假设用变量a、b、c、d、e分别代表A、B、C、D、E这5个人额头上贴纸的颜色,当变量的取值为1时表示该人额头上贴纸的颜色为白色,当变量取值为0时表示该人额头上贴纸的颜色为黑色。则分析题目中4个人所说的话如下:

(1) A说:“我看见有3人额头上帖的是白纸,1人额头上贴的是黑纸。”

如果A额头上贴的是白纸,那么他说的是实话,则有表达式:

a&&b+c+d+e==3

如果A额头上贴的是黑纸,那么他说的是谎话,则有表达式:

!a&&b+c+d+e!=3

(2) B说:“我看见其他4人额头上贴的都是黑纸。”

如果B额头上贴的是白纸,那么他说的是实话,则有表达式:

b&&a+c+d+e==0

如果B额头上贴的是黑纸,那么他说的是谎话,则有表达式:

!b&&a+c+d+e!=0

(3) C说:“我看见1人额头上贴的是白纸,其他3人额头上贴的是黑纸。”

如果C额头上贴的是白纸,那么他说的是实话,则有表达式:

c&&a+b+d+e=1

如果C额头上贴的是黑纸,那么他说的是谎话,则有表达式:

!c&&a+b+d+e!=1

(4) D说:“我看见4人额头上贴的都是白纸。”

如果D额头上贴的是白纸,那么他说的是实话,则有表达式:

d&&a+b+c+e==4

如果D额头上贴的是黑纸,那么他说的是谎话,则有表达式:

!d&&a+b+c+e!=4

算法设计

求解逻辑推理类问题的关键就是写出正确的逻辑表达式。将问题分析中列出的限定条件用程序语言描述清楚后就可以使用穷举法来获得最终的判断结果。

下面使用C语言中的逻辑表达式,将问题分析中得到的几个条件表达出来,得到的逻辑表达式如下:

(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)

在程序中穷举每个人额头帖纸的颜色的所有可能的情况,并代入上面的逻辑表达式中进行推理运算,能使该逻辑表达式的值为真的结果就是正确的结果。

下面是完整的代码:

#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额头上的贴纸是白色的.

C语言自动发牌程序代码及解析

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2018-11/155611.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款