和平社区

 找回密码
 注 册

QQ登录

只需一步,快速开始

查看: 1453|回复: 10

[灌水] 月薪3万的一道面试题------看看你的IQ

[复制链接]
发表于 2008-6-26 14:17: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日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天
 楼主| 发表于 2008-6-26 14:18:04 | 显示全部楼层
偶不知道,哎。。。IQ不行
发表于 2008-6-26 14:21:48 | 显示全部楼层
俺也不知道............................
发表于 2008-6-26 14:38:52 | 显示全部楼层
更不知道,樓下的回答0..........................................
发表于 2008-6-26 14:41:00 | 显示全部楼层
偶也不知道,楼下继续回答.............
发表于 2008-6-26 14:51:12 | 显示全部楼层
三八
发表于 2008-6-26 15:03:27 | 显示全部楼层
==========================分析===================================

1.小明说:如果我不知道的话,小强肯定也不知道
小明能肯定小强不知道,那就说明小强拿到的肯定不是7和2(因为7和2直接可以确定是6月7日和12月2日);
小明能肯定小强拿到的不是7和2,那么他自己拿到的肯定不是6和12

(以上推算我假设小强有与我一样的智商,将所有的6月与12月排除)

3月4日 3月5日 3月8日
9月1日 9月5日

2.小强说:本来我也不知道,但是现在我知道了
当小强知道了小明拿到的是3或者9,他马上就知道了准确日期,所以小强拿到的不可能是5,只能是1,4,8中的一个

(以上推算我假设小明有与我一样的智商,范围变为)
3月4日  3月8日
9月1日  

3.小明说:哦,那我也知道了

小明知道了,我的代码也算出来了
(如果有维一的月份,则小明能确定)
维一的月份是9




    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;
        }

    }

[ 本帖最后由 dali 于 2008-6-26 15:06 编辑 ]
发表于 2008-6-26 15:22:21 | 显示全部楼层
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月份的有两组)
发表于 2008-6-26 22:18:05 | 显示全部楼层
我是拿不到这月薪3万了。。
发表于 2008-6-26 23:19:25 | 显示全部楼层
难怪我拿不到月薪3万....
您需要登录后才可以回帖 登录 | 注 册

本版积分规则

站点统计|小黑屋|手机版|Archiver|和平家园 ( 粤ICP备13078947号-1 )

GMT+8, 2024-9-30 08:27 , Processed in 0.017236 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表