数据结构与算法面试题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;
}        
时间: 2024-10-05 09:37:22

数据结构与算法面试题80道(22)的相关文章

数据结构与算法面试题80道

由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价. 所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处. 向你的厚道致敬.谢谢. ------------------------------------------------------------------------------

数据结构与算法面试题80道(28)

28.整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 这是一道很基本的考查位运算的面试题. 包括微软在内的很多公司都曾采用过这道题. #include<iostream> #include<stdio.h> using namespace std; int howMachOne(int n){ int count=0; while(n){ if(n&1) count

数据结构与算法面试题80道(30)

30.在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:这是一道广为流传的google面试题. 最优美的算法就是按位进行分析 我们以21034来分析 如果将个位设为1,只考虑个位数上面的1,会有多少个1.(从1031->1021->1011->...->0001) 104个数包含104个1 如果将十位设为1,只考虑十位数上面的1,会

数据结构与算法面试题80道(23)

第23题(算法):用最简单,最快速的方法计算出下面这个圆形是否和正方形相交."  3D坐标系 原点(0.0,0.0,0.0)圆形:半径r = 3.0圆心o = (*.*, 0.0, *.*)正方形:4个角坐标;  1:(*.*, 0.0, *.*)2:(*.*, 0.0, *.*)3:(*.*, 0.0, *.*)4:(*.*, 0.0, *.*) 没搞懂坐标给的是什么意思,*.*表示坐标的值? 也不清楚圆和正方形是不是实心.如果是实心,那么内含也是相交.如果是空心,内含就是不相交. 单单说说圆

数据结构与算法面试题80道(11)

11.求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离. 错误思想:分别找左右子树到根的最深结点,相加. 错误原因:左子树上的左右子树到根的最深结点相加大于根节点左右子树到根的最深结点相加 正确思想:用动态规划来记录结点左右孩子的最大距离. 正确原因:从错误原因可以知道,最大距离为某一结点到它左右孩子的最大距离和 解题方法:(1)某一结点,左

数据结构与算法面试题80道(3)

3.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 .要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. //从第一个数开始加,和记为sum,用一个变量max记录最大和,如果和小于0,sum=0,扫描整个数组. #include<iostream> #inclu

数据结构与算法面试题80道(10)

第10题 翻转句子中单词的顺序. 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空 符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“student. a am I”. 思路:首先将整个句子按字符翻转,然后将句子的每个单词按字符翻转 #include<cstring> #include<iostream> using namespace std; //交换字母 void swap_word(c

数据结构与算法面试题80道(9)

第9题 判断整数序列是不是二元查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6    10 / \ / \ 5 7 9 11 因此返回true. 如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false. 开始把题看错了,打算建一颗二叉树,后续遍历,然后比较... 后来发现原来是判断一个数组

数据结构与算法面试题80道(7)

第7题 微软亚院之编程 判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交. 为了简化问题,我们假设俩个链表均不带环. 问题扩展: 1.如果链表可能有环列? 2.如果需要求出俩个链表相交的第一个节点列? 思路: 判断两个链表是否相交,并且求第一个节点列(无环). 利用计数 如果两个链表相交,两个链表就会有共同的结点列:统计链表的长度,求两个链表长度差(目的是将两个链表变成到末尾长度相同的两个链表,相交部分一定在里面),然后往后遍历,找到相等的结点,就是第一个结