数据结构与算法面试题80道(22)

4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在ABC三人额头上贴任意两张牌,

ABC三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,

A说不知道,B说不知道,C说不知道,然后A说知道了。

请教如何推理,A是怎么知道的。

如果用程序,又怎么实现呢?

分析:如果满足题设,每个人都有三种情况,红红、蓝蓝、红蓝。

如果在场的三个人,存在红红、蓝蓝、红蓝并且三个人都不知道,那么头上为红蓝的人可以猜出自己的颜色。

如果在场的三个人,存在(红红、蓝蓝、蓝蓝),那么肯定有人知道自己是什么颜色

如果在场的三个人,存在(红红、红红、蓝蓝),那么肯定有人知道自己是什么颜色

如果在场的三个人,存在(红蓝、红蓝、红蓝),那么三个人肯定都不知道自己是什么颜色

如果在场的三个人,存在(红红、红蓝、红蓝),那么三个人肯定都不知道自己是什么颜色

如果在场的三个人,存在(蓝蓝、红蓝、红蓝),那么三个人肯定都不知道自己是什么颜色

综上所述:A如果知道自己是什么颜色、并且三个人开始都不知道自己是什么颜色,说明BC肯定为蓝蓝红红或者红红蓝蓝,A肯定为红蓝

题意:用程序设计一个当B为红红、C为蓝蓝或者B为蓝蓝、C为红红的时候A为红蓝的电路。#include<cstdiostruct person{

int x;//代表红色牌的数量
    int y;//代表蓝色牌的数量
};

//判断是否三个人都不知道,并且判断每个人是不是有两个牌
bool init(person p1,person p2,person p3){
    if(p1.x+p2.x>3||p1.x+p3.x>3||p2.x+p3.x>3){
        cout<<"有人知道"<<endl;
        return false;
    }
    if(p1.y+p2.y>3||p1.y+p3.y>3||p2.y+p3.y>3){
        cout<<"有人知道"<<endl;
        return false;
    } 
    if(p1.x+p1.y!=2||p2.x+p2.y!=2||p3.x+p3.y!=2){
        cout<<"有人牌的数量不对"<<endl;
        return false;
    }
    if(p1.x<0||p1.y<0||p2.x<0||p2.y<0||p3.x<0||p3.y<0){
        cout<<"不合常理"<<endl;
        return false;
    }
    if(p1.x>2||p1.y>2||p2.x>2||p2.y>2||p3.x>2||p3.y>2){
        cout<<"不合规则"<<endl;
        return false;
    }
    return true;
}

//如果满足开始三个人都无法断定自己的颜色A能知道,输出true,否则输出false
bool youKnow(person p1,person p2,person p3){
    if(!init()) {cout<<"设计不合理"<<endl;return false;}
    if(p2.x==2&&p3.x==0) return true;
    else ifp2.x==0&&p3.x==2) return true;  
    else return false;
}

                                    

原文地址:https://www.cnblogs.com/wabi87547568/p/5271706.html