题目描述
小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日是下列10组中的一天:
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
张老师将M值告诉了小明,将N值告诉了小强,张老师问他们知道他的生日是哪一天吗?
小明说:如果我不知道的话,小强肯定不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
据上面信息,推断出张老师的生日是哪一天?
题目解析
这个逻辑题,如何用程序实现?其实这是一个建模过程,我们需要用专业的术语重新描述这个逻辑。
这个问题数据只有2个:月数和天数。逻辑是参杂2个人角度看问题的3句话。我们分析这个问题时,首先要保持第三者的视角,逐个从其他两个视角去分析这个问题。然后就是建立模型,我们看这样的数据有个特征:{Key,Value}键值对。但是可以看出这是个MultiMap,即一个键可以对应多个值。
我们沿着这个思路走.可以发现,站在小明的角度,我们可以将数据建立成一个MultiMap。他眼中的数据使用月数M为键,天数N为值。以后我们称下表为“小明表”。
可以站在小强的角度,我们将数据建立成一个新的MultiMap。他眼中的数据使用天数N为键,月数M为值。以后我们称下标为“小强表”。
我们再回到第三者的角度,可以得出,这两张表对于小明和小强都是可见的。
我们将小明和小强的对话,一条一条转换为约束条件。
1 小明说:如果我不知道的话,小强肯定不知道
小明是看了“小强表”之后得出以上结论。这句话意味着:他所知的M值在“小强表”中不存在Key Value唯一对应关系。即12月2日和6月7日,这两个月份12和6都不是老师的生日月数。因为如果是M是12或6,小明在不知道N的情况下,无法给定如此“拽”的回答。于是逐步排除出一下结果(红色代表排除的选项)
2 小强说:本来我也不知道,但是现在我知道了
小强在看到上图后,得出上面结论。这个说明,小强知道的N在上表中是Key Value唯一对应关系。于是得出
因为小强知道N是多少,所以剩下的选项中,他知道正确答案了。只是我们还不知道。我们期待小明的话。
3 小明说:哦,那我也知道了
对于小明,他和我们一样,可以看到上图。于是他知道N的值只可能是1、4、8。于是修改“小明表”为
由于此时小明已经知道了答案。可以见得M值在上表中是Key Value唯一对应关系。于是我们可以排除3和12。得出
此时有两个答案。我们此时结合筛选后的“小强表”
此时,我们可以说6月4日在“小强表”中已被排除,所以我们选择9月1日。或者我们从这个两个表中找到了唯一的共同选项,从而得知是9月1日。