迷语博士的难题

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

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

变量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;
}
相关文章
相关标签/搜索