问题:
有4 张红色的牌和4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴任意两张牌,A、B、C 三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A 说不知道,B说不知道,C 说不知道,然后 A 说知道了。
请教如何推理,A 是怎么知道的。如果用程序,又怎么实现呢?
分析
首先是三个人的第一反应都是不知道,所以任意两个人头上的同色牌个数不等于4,称这些组合成为合法组合。
然后是A说他知道了,说明B和C确定的情况下,A的合法组合只有一种可能。
因为A、B说不知道的情况下,C 没有说知道了,说明C都与A组合情况是不相同的。因为如果C和A相同,C此时和A最后掌握的信息一样多,C就能和A一样推断出自己的颜色。
思路
设置二维数组,[[0,2],[2,0],[1,1]]表示红蓝牌的组合
对ABC都赋值,也就是发牌。会得到以上的红蓝牌组合,之后判断ABC两两相加各红蓝牌的总数要<4,符合条件的A就是要求的A
代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
//[0,2]0红2蓝 [2,0]02红0蓝 [1,1]一红一蓝
var arr = [[0, 2], [2, 0], [1, 1]];
console.log(arr[0])
var C=[];
var B=[];
var A=[];
var count= 0;
var retArr=[];
for (var i = 0; i < 3; i++)//对ABC赋值三种情况
{
C = arr[i];
for (var j= 0; j < 3; j++)
{
B= arr[j];
count = 0;
for (var k=0; k < 3; k++)
{
A = arr[k];
// 判断是否满足任意两个人头上的牌同色小于4
if (C[0] + B[0] < 4 && C[0] + A[0] < 4 && B[0] + A[0] < 4
&& C[1] + B[1] < 4 && C[1] + A[1] < 4 && B[1] + A[1] < 4)
{
retArr=A;//A是满足小于4的结果,存入结果
count++;//条件成立,count+1
}
}
// 确认对面两人的牌色,自己的牌色是否只有一种组合,如果成立,这就是结果。
if (count == 1&&(C[0] != retArr[0] || C[1] != retArr[1]))
{
console.log('可以推断出来的结果-->', retArr.join(','));
}
}
}
</script>
</html>