【智力题】 4红牌、4蓝牌算法实现

本文通过逻辑推理解析了一个关于红蓝牌的游戏谜题,并提供了一段C++代码来验证推理过程。推理过程中考虑了所有可能的牌组合,通过逐步排除最终得出结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有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一样推断出自己的颜色。


int main(int argc, char *argv[])
{
    vector<vector<int>> vec = { { 0, 2 }, { 2, 0 }, { 1, 1 } };
    vector<int> A, B, C, retArr;
    int count(0);

    for (auto i  = 0; i < 3; i++)
    {
        C = vec[i];
        for (auto j = 0; j < 3; j++)
        {
            B = vec[j];
            count = 0;
            for (auto k = 0; k < 3; k++)
            {
                A = vec[k];
                // 判断是否满足任意两个人头上的牌同色等于4
                if (A[0] + B[0] < 4 && A[0] + C[0] < 4 && B[0] + C[0] < 4
                    && A[1] + B[1] < 4 && A[1] + C[1] < 4 && B[1] + C[1] < 4)
                {
                    retArr = A;
                    count++;
                }
            }
            // 确认对面两人的牌色,自己的牌色是否只有一种组合,如果成立,这就是结果。
            if (count == 1 && (C[0] != retArr[0] || C[1] != retArr[1]))
            {
                cout << retArr[0] << retArr[1] << endl;
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值