前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迷语博士的难题

迷语博士的难题

作者头像
week
发布2018-08-24 09:51:53
8320
发布2018-08-24 09:51:53
举报
文章被收录于专栏:用户画像用户画像用户画像

两面族是荒岛上的一个新民族,他们的特点是说话真一句假一句且真假交替。如果第一句为真,则第二句是假的;如果第一句为假的,则第二句就是真的,但是第一句是真是假没有规律。 迷语博士遇到三个人,知道他们分别来自三个不同的民族:诚实族、说谎族和两面族。三人并肩站在博士前面。 博士问左边的人:“中间的人是什么族的?”,左边的人回答:“诚实族的”。 博士问中间的人:“你是什么族的?”,中间的人回答:“两面族的”。 博士问右边的人:“中间的人究竟是什么族的?”,右边的人回答:“说谎族的”。 请问:这三个人都是哪个民族的?

解题时要使用变量将这三个民族分别表示出来 

变量A=1,表示:左边的人是诚实族的 

变量B=1,表示:中间的人是诚实族的 

变量C=1,表示:右边的人是诚实族的 

变量AA=1表示:左边的人是两面族的 

变量BB=1表示:中间的人是两面族的 

变量CC=1表示:右边的人是两面族的 

则左边的人是说谎族的可以表示为:A!=1且AA!=1 用C语言表示为!A&&!AA 

则中间的人是说谎族的可以表示为:B!=1且BB!=1 用C语言表示为!B&&!BB 

则右边的人是说谎族的可以表示为:C!=1且CC!=1 用C语言表示为!C&&!CC 

则左边的人是说谎族的可以表示为:A!=1且AA!=1 用C语言表示为!A&&!AA 

则中间的人是说谎族的可以表示为:B!=1且BB!=1 用C语言表示为!B&&!BB 

则右边的人是说谎族的可以表示为:C!=1且CC!=1 用C语言表示为!C&&!CC 

根据三个人来自三个民族的条件可知: a+aa!=2 && b+bb!=2 && c+cc!=2 且a+b+c ==1 && a+b+c ==1 

由左人回答推出:a && !aa && b && !bb || !a && !b 

1、左边是诚实族,中间是诚实族 

2、左边是说慌族,中间是说谎族 

有中间人回答推出:!b 

1、中间人不是诚实族 

由右人回答推出:c && !b && !bb || (!c && !cc) && (b || bb) || !c && cc 

1、右边是诚实族,中间的是说谎族 

2、右边是说谎族,中间是诚实族或者两面族 3、右边是两面族

#include<stdio.h>
/**
 *
 * 迷语博士的难题(2)  两面族是荒岛上的一个新民族,他们的特点是说话真一句假一句且真假交替。
 * 如果第一句为真,则第二句是假的;如果第一句为假的,则第二句就是真的,但是第一句是真是假没有规律。
    迷语博士遇到三个人,知道他们分别来自三个不同的民族:诚实族、说谎族和两面族。三人并肩站在博士前面。
    博士问左边的人:“中间的人是什么族的?”,左边的人回答:“诚实族的”。
    博士问中间的人:“你是什么族的?”,中间的人回答:“两面族的”。
    博士问右边的人:“中间的人究竟是什么族的?”,右边的人回答:“说谎族的”。
    请问:这三个人都是哪个民族的?

    解题时要使用变量将这三个民族分别表示出来

    变量A=1,表示:左边的人是诚实族的

    变量B=1,表示:中间的人是诚实族的

    变量C=1,表示:右边的人是诚实族的

    变量AA=1表示:左边的人是两面族的

    变量BB=1表示:中间的人是两面族的

    变量CC=1表示:右边的人是两面族的

    则左边的人是说谎族的可以表示为:A!=1且AA!=1  用C语言表示为!A&&!AA

    则中间的人是说谎族的可以表示为:B!=1且BB!=1  用C语言表示为!B&&!BB

    则右边的人是说谎族的可以表示为:C!=1且CC!=1  用C语言表示为!C&&!CC

    根据三个人来自三个民族的条件可知:

    a+aa!=2 && b+bb!=2 && c+cc!=2  且a+b+c ==1 && a+b+c ==1

    由左人回答推出:a && !aa && b && !bb || !a && !b
    1、左边是诚实族,中间是诚实族
    2、左边是说慌族,中间是说谎族

    有中间人回答推出:!b
    1、中间人不是诚实族

    由右人回答推出:c && !b && !bb || (!c && !cc) && (b || bb) || !c && cc
    1、右边是诚实族,中间的是说谎族
    2、右边是说谎族,中间是诚实族或者两面族
    3、右边是两面族
 * @return
 */

int main()
{
    int a;
    int b;
    int c;
    int aa;
    int bb;
    int cc;

    for(a = 0;a <= 1;a++)
    {
        for(b = 0;b <= 1;b++)
        {
            for(c = 0;c <= 1;c++)
            {
                for(aa = 0;aa <= 1;aa++)
                {
                    for(bb = 0;bb <= 1;bb++)
                    {
                        for(cc = 0;cc <= 1;cc++)
                        {
                            if(a + aa != 2 && b + bb != 2 && c + cc != 2 &&
                               a + b + c == 1 && aa + bb + cc == 1       &&
                               (a && !aa && b && !bb || !a && !b)         &&
                               !b                                        &&
                               (c && !b && !bb || (!c && !cc) && (b || bb) || !c && cc))
                            {
                                printf("The man stand on left is a %s. \n",
                                       aa ? "double-dealer" : (a ? "honest" : "lier"));
                                printf("The man stand on center is a %s. \n",
                                       bb ? "double-dealer" : (b ? "honest" : "lier"));
                                printf("The man stand on right is a %s. \n",
                                       cc ? "double-dealer" : (c ? "honest" : "lier"));
                            }
                        }
                    }
                }
            }
        }
    }

    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档