红蓝牌问题算法

问题:

有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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值