[原创]破解面试智力题 -- 真话假话守卫问题

标签:
智力题 |
分类: 算法 |
号称苹果招聘八大难题的第一个,就是这个古老的寻宝问题:
要确定宝藏所在,所设计的问题必须能够满足(1)同样的问题在问两个人时得到的答案是不同的;(2)根据答案能够确定被问之守卫的门后是否有宝藏。
如果将现实条件构成一个两维的平面,那么真话守卫和假话守卫是其中的一维,而有宝藏和无宝藏是另外的一维。我们的问题将是关于这两维的一个函数,答案是第三维,它告诉我们守卫门后是否是宝藏。如果我们的问题是个与第三维相类的一重逻辑,比如“你守的是宝藏吗?”,那么这两个守卫的回答一定是相同的,因而无法做出判断,如下面左图所示,实线表示第三维的答案“守宝藏”,虚线表示第三维的“守虚无”。而我们的目标是得到右图的答案映射,也就是说无论守宝藏的是真话守卫还是假话守卫,他们的回答一定是“守宝藏”,反之亦然。
http://s4/mw690/001xx3uygy6OJF3FvA743&690--
我们将真话守卫标记为1,假话守卫为0;守宝藏标记为1,守虚无为0。左图可以表示为
http://s14/small/001xx3uygy6OJHjuUOh2d&690--
而右图则是
http://s9/mw690/001xx3uygy6OJHtEDFK28&690--
注意到函数第二维自变量和第三维因变量含义是一致的,因此可以做变量代换如下(函数第二维作了映射):
http://s3/bmiddle/001xx3uygy6OJHVMCTE02&690--
问题解决,我们要问的问题就是f(1,
1),即“真话守卫守的是宝藏吗?”,或者是其等价问题。
再换另外一个思路来解决问题。要满足前面提到的两个条件,我们希望在现实情况的激励下守卫答案输出的是明确的守卫状态,即“守宝藏”输出1,“守虚无”输出0。守卫位置是一个输入变量,门后内容是另一个输入变量,对应的输出也有两个,分别是两个守卫的回答。据此构造卡诺图如下,左边是真话守卫的激励输出,右边是假话守卫的激励输出,两者恰好互逆。可以看出此输出的状态机是一个同或函数,即“真话守卫与宝藏处于相同位置”,所以构造的问题就是“真话守卫守的是宝藏吗?”。
http://s4/mw690/001xx3uygy6OJKza0Txd3&690--
附:苹果招聘八大难题