聪明的学生

来源:互联网 发布:汉诺塔递归java代码 编辑:程序博客网 时间:2024/04/30 18:17

      一个教授逻辑学的教授有三个非常善于推理且精于心算的学生A,B,C。有一

天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸,并告诉他们

,每个人的字条上面写了一个正整数,且某两个数的和等于第三个。同时,每个

学生都能看见另外两个学生头上的整数,却看不见自己的数。
      这时,教授先对A学生发问:“你能猜出自己的数么?”A回答:“不能。"

教授转身问B:“你能猜出自己的数么?”B想了想也回答:“不能。”教授再问C

学生同样的问题,C思考了片刻,摇了摇头:“不能。”接着,教授又问A,再问B

和C,......经过若干论的提问后,当教授再次询问某人时,此人露出了得意的笑

容,把贴在自己头上的那个数准确无误的报了出来。
      现在,如果告诉你:教授在N次提问后,回答问题的那个人猜出自己头上的

那个数是M,你能推断出两外两个学生的头上贴的是什么数么?
      提示:总是头上贴着最大数的那个人最先猜出自己头上的数。


分析:
     每个人判断的依据是另外两个人头上的数以及大家对教师提问所作出的否定

回答。并且,当一个学生看到另外两个学生头上的数时,他就知道自己的数只有

两种可能,两数之差或者两数之和。否定其中的一个答案,那另一个就是正确的

答案。因为数为正整数,若某个学生看到另外两个学生头上的数相等时,那他立

刻就能判断出自己的数是另外两个数的和。
     举个例子:当N=5,M=8时,有一个可能的情况是A,B,C三人头上的数分别为2

,8,6。B怎么样猜出自己的数的呢?他是这样想的:
     B看到A的是2,看到C的是6,因此B的数为4或者8,假设B的数为4,那么当教

授第三次提问C回答时,C就能猜出自己的数。因为A为2,B为4,那么C不可能为2

,因为C为2,那么B就在教授第二次提问B时,B能回答出自己是4。然而,C没有能

够知道自己的数,所以,B的假设是错误的,即B的值为8。

     现在,实际上能够解决这样一个问题:
     已知,A,B,C三人头上的数位X1,X2,X3,求教授至少提问多少次,轮到回答的

那个人能猜出自己头上的数?
     分析下这个问题。当X1,X2,X3给出时,谁先猜出就确定了。(最大的那个数

的人先猜出),不妨假设X2=X1+X3,那么B作出判断的依据是排除了X2=|X1-X3|的

可能解,即排除X1=X3或者在X2=|X1-X3|的前提下,A,C能够在B之前判断出自己为

最大的那个数。而实际上,A,C并没有猜出。此时,我们把后一种可能转化成排除

在X1,|X1-X3|,X3的情况下,A,C能够猜出谁最大,而该问题就是大问题要求解的

子问题。这就变成了一个递归求解的过程。
     设函数Times(i,j,ti,t2,t3)表示编号为t1的人头上的数是i,编号为t2人头

上的数是j,编号是t3人头上的数是i+j时教授需要提问的次数,而P(t1,t2)表示

教授按照1,2,3的顺序从t1问到t2需要提问的最少次数。则有下列关系:
                                     t3     i=j
     Times(i,j,ti,t2,t3)=    Times(j,i-j,t2,t3,t1)+P(t1,t3)  i>j
                                     Times(i,j-i,t1,t3,t2)+P(t2,t3)  i<j

PS:次数怎么算没有弄明白。

原创粉丝点击