小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日 
    是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 
    3月4日 3月5日 3月8日 
    6月4日 6月7日 
    9月1日 9月5日 
    12月1日 12月2日 12月8日 
    小明说:如果我不知道的话,小强肯定也不知道 
    小强说:本来我也不知道,但是现在我知道了 
    小明说:哦,那我也知道了 
    请根据以上对话推断出张老师的生日是哪一天 

解决方案 »

  1.   

    答案应该是9月1日。 google一把就可以赚3万月薪?google的魅力啊!
      

  2.   

    答案应该是9月1日。 
    1)首先分析这10组日期,经观察不难发现,只有6月7日和12月2日这两组日期的 
    日数是唯一的。由此可知,如果小强得知的N是7或者2,那么他必定知道了老师的 
    生日。 
    2)再分析“小明说:如果我不知道的话,小强肯定也不知道”,而该10组日期的 
    月数分别为3,6,9,12,而且都相应月的日期都有两组以上,所以小明得知M后 
    是不可能知道老师生日的。 
    3)进一步分析“小明说:如果我不知道的话,小强肯定也不知道”,结合第2步 
    结论,可知小强得知N后也绝不可能知道。 
    4)结合第3和第1步,可以推断:所有6月和12月的日期都不是老师的生日,因为 
    如果小明得知的M是6,而若小强的N==7,则小强就知道了老师的生日。(由第 
    1步已经推出),同理,如果小明的M==12,若小强的N==2,则小强同样可以知道老师的生日。即:M不等于6和9。现在只剩下“3月4日 3月5日 3月8日 9月1日 
    9月5日”五组日期。而小强知道了,所以N不等于5(有3月5日和9月5日),此时, 
    小强的N∈(1,4,8)注:此时N虽然有三种可能,但对于小强只要知道其中的 
    一种,就得出结论。所以有“小强说:本来我也不知道,但是现在我知道了”, 
    对于我们则还需要继续推理 
    至此,剩下的可能是“3月4日 3月8日 9月1日” 
    5)分析“小明说:哦,那我也知道了”,说明M==9,N==1,(N==5已经被排除,3月份的有两组)
      

  3.   

    代码大概是:    class begin
        {
        
            static void Main()
            {
                //初始化生日集合
              
                生日集合 srjh=new 生日集合();            srjh.Add(new 生日类(3,4));
                srjh.Add(new 生日类(3,5));
                srjh.Add(new 生日类(3,8));
                srjh.Add(new 生日类(6,4));
                srjh.Add(new 生日类(6,7));
                srjh.Add(new 生日类(9,1));
                srjh.Add(new 生日类(9,5));
                srjh.Add(new 生日类(12,1));
                srjh.Add(new 生日类(12,2));
                srjh.Add(new 生日类(12,8));
               
                //开始工作流            工作流.BEG(srjh);
                
                System.Console.Read();
            }    
        }//工作流
        class 工作流
        {
            /**//*    开始结点
             *     ↓
             *    结点A:如果我不知道的话 →结点X:小明知道(该节点分支略)
             *     ↓
             *    结点B:小强肯定也不知道
             *     ↓
             *    结点C: 小强说:现在我知道了
             *     ↓
             *    结点D:小明说:哦,那我也知道了
             *     ↓
             *    结束结点
             * 
             */
                  public static void BEG(生日集合 obj)
            {
                if(obj !=null)
                {   
                    A(obj);//下一结点
                }
            }        //结点A:如果我不知道的话
            private static void A(生日集合 obj)
            {
                生日集合 jh=AI.小明分析(obj);            if(jh.Count==0)
                {
                    B(obj); //下一结点
                }
                else
                {
                    //小明可以光凭月知道的集合
                    //该节点分支略
                }
            }        //结点B:小强肯定也不知道
            private static void B(生日集合 obj)
            {
                //得到小强光凭日期就能知道的集合
                生日集合 小强知道的集合=AI.小强分析(obj);            //小明之所以知道小强肯定不知道,
                //是因为小明知道的月份不是小强光凭日期就能知道的
                         
                生日集合 排除的集合=new 生日集合();
                foreach(生日类 temp in 小强知道的集合)
                {
                    foreach(生日类 tp in obj)
                    {
                        if(temp.月==tp.月)
                        {
                            排除的集合.Add(tp);
                        }
                    }
                }            集合操作.排除(obj,排除的集合);            C(obj);//下一结点
            }
        
            //结点C: 小强说:现在我知道了
            private static void C(生日集合 obj)
            {
                生日集合 小强知道的集合=AI.小强分析(obj);
                D(小强知道的集合); //下一结点
            }        //结点D:小明说:哦,那我也知道了
            private static void D(生日集合 obj)
            {
                生日集合 小明知道的集合=AI.小明分析(obj);
                END(小明知道的集合);//下一结点
            }        //完成结点:
            private static void END(生日集合 obj)
            {
                //完成,输出到屏幕
                foreach(生日类 temp in obj)
                {
                    System.Console.WriteLine(temp.月.ToString() +"-" +temp.日.ToString());
                }
            }    }
        //功能扶助类    class 集合操作
        {
            public static void 排除(生日集合 s,生日集合 v)
            {
                foreach(生日类 temp in v)
                {
                    s.Remove(temp);            }        }
        }    
        class 生日类
        {
            public int 日=0;
            public int 月=0;
            public 生日类(int y,int r)
            {
                日=r;
                月=y;
            }    }    
        class 生日集合:System.Collections.ArrayList
        {
            public void 添加(生日类 v)
            {
                this.Add(v);
            }        public void 移除(生日类 v)
            {
                this.Remove(v);
            }    }
        class AI
        {
            public static 生日集合 小明分析(生日集合 v)
            {
                //AI,如果有维一的月份,则小明能确定
                //月份为1到12            生日集合 jh=new 生日集合();            int n=0;//记数器,如果n=1表示有            for(int i=1;i<=12;i++)
                {
                    生日类 x=null;
                    foreach(生日类 temp in v)
                    {
                        if(temp.月==i)
                        {
                            n=n+1;
                            x=temp;
                        }
                       
                    }
                        if(n==1)
                        {
                            jh.Add(x);
                        }                n=0;            }            return jh;
            }        public static 生日集合 小强分析(生日集合 v)
            {
                //AI,如果有维一的日,则小强能确定
                //日为1到31            生日集合 jh=new 生日集合();            int n=0;//记数器,如果n=1表示有            for(int i=1;i<=31;i++)
                {
                    生日类 x=null;
                    foreach(生日类 temp in v)
                    {
                        if(temp.日==i)
                        {
                            n=n+1;
                            x=temp;
                        }
        
                    }
                    if(n==1)
                    {
                        jh.Add(x);
                    }                n=0;            }            return jh;
            }    }
      

  4.   

    bao110908 
    火龙果 
    等 级:
     发表于:2008-02-26 17:30:559楼 得分:0 
    我记得这题原来只有1万,现在涨成3万了啊? 
     ======================================
    連方便面都長了3毛,跟何況這道題目?
    現在只有工資是部長的啊
      

  5.   

    迷茫,这种题是跟JAVA相关的吗?还有方便面涨的太快了!~
      

  6.   

    正确答案是:都说是9.1
    测试Java代码!!
    public   static   生日集合   小明分析(生日集合   v) 
                    { 
                            //AI,如果有维一的月份,则小明能确定 
                            //月份为1到12                         生日集合   jh=new   生日集合();                         int   n=0;//记数器,如果n=1表示有                         for(int   i=1;i <=12;i++) 
                            { 
                                    生日类   x=null; 
                                    foreach(生日类   temp   in   v) 
                                    { 
                                            if(temp.月==i) 
                                            { 
                                                    n=n+1; 
                                                    x=temp; 
                                            } 
                                          
                                    } 
                                            if(n==1) 
                                            { 
                                                    jh.Add(x); 
                                            }                                 n=0;                         }                         return   jh; 
                    } 
      

  7.   

    是c++primer4书上的一道题..怎么成这个了
      

  8.   

    zxhtgh 
    朱能文 
    等 级:
     发表于:2008-02-27 17:34:5027楼 得分:0 
    3月4日   3月8日   何尝不可? 看看题中的组合 
                    3月4日       3月5日       3月8日       
        6月4日       6月7日       
        9月1日       9月5日       
        12月1日       12月2日       12月8日       既然小强通过小明的话排除了6月和12月   那么除了3月和9月重复的5日不能确定外,这两个月内4日、8日、1日都是唯一的了,也就是说小强可以确定3月4日、3月8日、9月1日中的任何一日,题目中的最后“小明说:哦,那我也知道了”没有道理,此题有问题,出题的师傅没有考虑周全    
     
    好像有问题回头我解答
      

  9.   

    这个题这样解释最简单:step1: 由小明的最后一句话:“小明说:哦,那我也知道了” 就可判断出只会是6或9月
    (没有这句话,小强的“知道”也是不能确认的,这最后一句是整个判断必不可少的)
    step2: 因第一句“如果我不知道的话,小强肯定也不知道” 可排除6月7日step3: 现在只有6月4日、9月1日、 9月5日三个日期了,很简单,只有1日是所有日子里唯一的(4,5不唯一,他们也不可能“知道”)
    我样是不是这个题变得很简单了? :)
      

  10.   

    color=#0000FF][/color]
    好强呀!
    请问你是从事什么工作的?
      

  11.   

    //我的算法public class A {

    public static void main(String[  ] args){
    int[  ] yue = { 3, 3, 3, 6, 6, 9, 9, 12, 12, 12 }; int[  ] ri = { 4, 5, 8, 4, 7, 1, 5, 1, 2, 8 }; boolean[  ] r = { true, true, true, true, true, true, true, true, true, true }; int[  ] temp = new int[ 13 ];
    for (int i = 0; i <ri.length ; i++) {//小明说:如果我不知道的话,小强肯定也不知道 得知,日期只出现一次的日期一定不是。
    temp[ ri[ i ] ]++;
    }

    for (int i = 0; i < temp.length; i++) {//确定出来一定不符合题意的日期,标记为 false
    if (temp[ i ] == 1){
    for (int j = 0; j < ri.length; j++) {
    if (i == ri[ j ]){
    r[ j ]=false;
    }
    }
    }
    }

    for (int i = 0; i < r.length; i++) {//划掉上面日期对应的月份
    if (!r[ i ]){
    for (int j = 0; j < yue.length; j++) {
    if (yue[ i ] == yue[ j ]){
    r[ j ] = false;
    }
    }
    }
    }

    temp = new int[ 13 ];//初始化数组
    for (int i = 0; i < r.length; i++) {//划掉上面日期对应的月份
    if (r[ i ]){
    temp[ ri[ i ] ]++;
    }
    }

    for (int i = 0; i < temp.length; i++) {//由于:小强说 本来我也不知道,但是现在我知道了 可知:剩下的数据中,日期重复的可以划掉。
    if (temp[ i ] > 1){
    for (int j = 0; j < ri.length; j++) {
    if (i == ri[ j ]){
    r[ j ]=false;
    }
    }
    }
    }

    temp = new int[ 13 ];//初始化数组
    for (int i = 0; i < r.length; i++) {//划掉月份上重复的数据。就是答案了
    if (r[ i ]){
    temp[ yue[ i ] ]++;
    }
    }

    for (int i = 0; i < temp.length; i++) {
    if (temp[ i ] > 1){
    for (int j = 0; j < yue.length; j++) {
    if (i == yue[ j ]){
    r[ j ]=false;
    }
    }
    }
    }

    for (int i = 0; i < r.length; i++) {
    if (r[ i ]){
    System.out.println("生日的日期是" + yue[ i ] + "月" + ri[ i ] + "日");
    }
    }

    }
    }
      

  12.   

    小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日 
        是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 
        3月4日 3月5日 3月8日 
        6月4日 6月7日 
        9月1日 9月5日 
        12月1日 12月2日 12月8日 
        (1)小明说:如果我不知道的话,小强肯定也不知道 
        (2)小强说:本来我也不知道,但是现在我知道了 
        (3)小明说:哦,那我也知道了 
        请根据以上对话推断出张老师的生日是哪一天 其实另一种6月4号也是对的
      
      <1>先看第2句(小强说的:本来我也不知道,但是现在我知道了)
              "本来我也不知道":说明老师告诉他的这天不是唯一的(把6月7日,12月2日去掉)
              现在我门得到的结果是
               3月4日 3月5日 3月8日 
           6月4日 6月7日 
           9月1日 9月5日 
           12月1日 12月2日 12月8日 
      <2>在看第1句(小明说:如果我不知道(这个月)的话,小强肯定也不知道(生日))
              我门反想下(小明说:如果我知道的话,小强可能就知道了)
                       (1)假设下:小明知道的这个月是3(3个日期),9(2个日期),12(2个日期) 
                             小强还是肯定不知道生日是哪天,因为这3个月的日期都有2个以上;
                             我门在顺过来想下:只有小明的月是6的时候,小强才可能知道;所以当小明说了以后,小强就确定下了一个日期,因为6月就一个6月4日了
    所有更加坚定了我6月4号的想法,9月1号反而有漏洞.  
    因为( 小明说:如果我不知道的话,小强肯定也不知道 得知,日期只出现一次的日期一定不是。 
          只能说明:6月7号和12月2号这两个日期不是 
          为什么要把所有6月和12月的日期都排除呢
    ?)               
                               
              
      

  13.   

    排除法,看看这几个日期: 
    3月4日   3月5日   3月8日   6月4日   6月7日   
    9月1日   9月5日   12月1日   12月2日   12月8日 M   月份有:   3   ,6,   9   ,12 N   日有:1,   2,   4,   5,   7,   8, 
                    9       12     3       3       6       3 
                    12             6       9               12 
    小明知道M. 
    小紅知道N. 
    小明说:如果我不知道的话,小紅肯定也不知道   
    小明为什么敢这样说呢?             N     1,   2,   4,   5,   7,   8, 
                M     9       12     3       3       6       3 
                M     12             6       9               12 
    假设如果是2日,小明就不用说就知道生日了(小明之前不知道生日:因为他后面说”哦,那我也知道了“)。所以排除2N,12M和6M 
                
    1.小明会想是哪一日呢?             N     1,     4,   5,     8, 
                M     9         3       3         3 
                M                       9   
    2.小红会想现在就3M和9M了。是哪一月呢? 
              M   3,   9 
              N   4     1 
              N   5     5 
              N   8 小明说了这句话后小紅说:本來我也不知道,但是现在我知道了   . 
    把12M和6M给排除了后小紅就知道答案了! 显然5日排除。如果是5日小紅是不知道答案的。 
              
              N     1,     4,     8, 
              M     9         3         3           M   3,   9 
              N   4     1     
              N   8 
    再显然3日排除。如果是3日小紅会有4月还是9月的选择,也是不知道答案的。 
    小明接着就说:哦,那我也知道了   。也说明了排除3日这一点。 所以老师的生日就是9月1日了。您理解了吗! 呵呵。还是在纸上画方便些。 
      

  14.   

    9/1 is the correct answer, it is not very hard
      

  15.   

    欢迎加入java技术交流群88875524
      

  16.   

    小明为 A,小强为 B
    A 只会拿到 3、6、9、12 四个中的一个。无论拿到哪一个都不会知道生日是哪一天,那么他就会判断 B 拿的是什么。-------------------------------------------------------------
    先来看第一句话。在什么情况下 A 会这样说?
    -------------------------------------------------------------
    如果 A 拿的是 3:
      则 B 只会拿到 4、5、8 三个中的一个。
      如果 B 拿的是 4,则有 3月4日 和 6月4日 两个日期,所以 B 不知道会是哪一个。
      同理,如果B拿的是5和8也不会知道。
    结论:A 会说出“如果我不知道的话,小强肯定也不知道”的话。如果 A 拿的是 6:
      则 B 只会拿到 4、7 中的一个。
      如果 B 拿的是 7,那么 B 就知道了;如果拿的是 4,就不会知道。
    结论:B 有可能知道,所以 A 不会说出“如果我不知道的话,小强肯定也不知道”的话。由此可知 A 不可能拿的是 6。如果 A 拿的是 9:
      则 B 只会拿到 1、5 中的一个。1也好,5也好,都有重复,所以 B 都不会知道。
    结论:A 会说出“如果我不知道的话,小强肯定也不知道”的话。如果 A 拿的是 12:
      则 B 只会拿到 1、2、8 中的一个。如果拿的是 2,那么 B 就会知道;如果拿 1 和 8 就不会知道。
    结论:B 有可能知道,所以 A 不会说出“如果我不知道的话,小强肯定也不知道”的话。由此可知 A 也不可能拿的是 12。以上分析得出 A 拿是 3 或 9。
    由此可以知道 B 拿的肯定是 1、4、5、8 中的一个,同时 B 也根据 A 的话得出 A 拿的是 3 或 9。
    那么结果肯定在以下几个日期中:
    3月4日3月5日3月8日
    9月1日9月5日
    ======================================================================-------------------------------------------------------------
    再来看第二句话。在什么情况下 B 会这样说?
    -------------------------------------------------------------
    如果 B 拿的是 1:
      则 A 拿的肯定是 9。由此 B 就知道了生日是 9月1日。
    结论:B 会说出“本来我也不知道,但是现在我知道了”的话。如果 B 拿的是 4:
      则 A 拿的肯定是 3。由此 B 就知道了生日是 3月4日。
    结论:B 会说出“本来我也不知道,但是现在我知道了”的话。如果 B 拿的是 5:
      则 A 拿的是 3、6 中的一个,所以 B 不可能知道。
    结论:B 不会说出“本来我也不知道,但是现在我知道了”的话。由此可知 B 拿的不是5。如果 B 拿的是 8:
      则 A 拿的肯定是 3。由此 B 就知道了生日是 3月8日。
    结论:B 会说出“本来我也不知道,但是现在我知道了”的话。以上分析得出 B 拿的是 1、4、8 中的一个。
    那么结果肯定在以下几个日期中:
    3月4日3月8日
    9月1日======================================================================-------------------------------------------------------------
    分析到此还未得出结果,关键在第三句话。
    从第一句话的分析结果得知,A 拿的是 3 或 9。那么在什么情况下 A 会说出“哦,那我也知道了”的话呢?
    -------------------------------------------------------------
    如果 A 拿的是 3:
      则结果可能是 3月4日 或 3月8日,那么 A 就不会知道。
    结论:A 不会说出“哦,那我也知道了”的话。由此可知 A 拿的不是 3。如果 A 拿的是 9:
      则结果肯定是 9月1日。
    结论:A 会说出“哦,那我也知道了”的话。以上分析得出 A 拿的是 9。由此可以得知,最终答案是:9月1日。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Triumph/archive/2008/03/30/2231716.aspx
      

  17.   

    3月4日 3月5日 3月8日 
    6月4日 6月7日 
    9月1日 9月5日 
    12月1日 12月2日 12月8日 
    因为 小明说:如果我不知道的话,小强肯定也不知道 
    所以 推断小明知道的月里面肯定不存在唯一可推断的日 这样可以得到小明拿的M是3和9因为 小强通过小明的上句话知道了M是3或9,而且知道N
    当小强说:本来我也不知道,但是现在我知道了
    可以反推如果小强手中的N是5,那么他就不可能知道日期这时可以选择的数据有 3月4日 3月8日 9月1日
    因为 小明说:哦,那我也知道了
    假设小明的M是3,那么他依然不知道日期
    所以推断M是9 N是1 
     
      

  18.   

    小明和小强都是张老师的学生,张老师的生日是M月N日,2人都不知道张老师的生日
        是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
        3月4日 3月5日 3月8日
        6月4日 6月7日
        9月1日 9月5日
        12月1日 12月2日 12月8日
        小明说:我不知道,但我敢肯定小强也不知道
        小强说:本来我也不知道,但是现在我知道了
        小明说:哦,那我也知道了
        请根据以上对话推断出张老师的生日是哪一天 
      

  19.   

    小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
        3月4日 3月5日 3月8日
        6月4日 6月7日
        9月1日 9月5日
        12月1日 12月2日 12月8日
        小明说:我不知道,但我敢肯定小强也不知道
        小强说:本来我也不知道,但是现在我知道了
        小明说:哦,那我也知道了
        请根据以上对话推断出张老师的生日是哪一天