数据结构与算法面试题80道(22)
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,
A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,
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; }