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

来源:互联网 发布:流川枫和苍井空 知乎 编辑:程序博客网 时间:2024/05/02 09:18

有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;}
原创粉丝点击