智力逻辑题程序实现(生日猜测)

昨天突然在网上看到这个智力题, 以下为分析以及程序实现过程.

智力题原题:   

    小明和小强都是张老师的学生,张老师的生日是M月N日?
    小明和小强都是张老师的学生,张老师的生日是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日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但现在我知道了
小明说;哦,那我也知道了

 

条件一:  小明说: 如果我不知道的话,小强肯定不知道.  

            分析: 此句话可以说明两点,第一点,张老师对应的生日的N在以上日期中不能是唯一,纵观以上日期,生日的N可能取值:4,5,8,4,7,1,5,1,2,8.  依此看,N不能为2与7.  另外,还可以排队N为2与7所对应的月份. 因为当张老师的生日的M为6或12时,小强是可能知道生日的,与已知条件相违背.

            终上条件一可以得出: 单独的N所对应的月份的所有生日都将排除.  也就是说,6月与12月的生日都将排队

条件二:  小强说:本来我不知道,但现在我知道了

            分析: 根据条件一排除的日期看,现在生日的N应该是单一的.

            终上条件二可以得出: 重复的N所对应的生日应该排除

条件三:  哦,那我也知道拉

            分析: 根据条件二的结果,现在可以确认生日对应的M应该是单一的. 此时日期也将被确定

            终上条件三可以得出: 单一的M值可能成为张老师的生日

 

 以上为分析过程式,如何用程序来实现呢?  程序实现的过程主要是对三个条件进行处理.

           程式处理:  1:  删除单独的N所对应月份的所有生日

                         2:  删除重复的N所对应的生日

                         3:  删除重复的M所对应的生日

 

程序代码如下:

 生日对象:

 1    public   class  Birthday:Object
 2      {
 3           public  Birthday()
 4          {
 5   
 6          }
 7           public   int  Month
 8          {
 9               get ;
10               set ;
11          }
12           public   int  Day
13          {
14               get ;
15               set ;
16          }
17           public   override   string  ToString()
18          {
19               return  Month  +   " "   +  Day  +   " " ;
20          }
21      }


初始化参数:

 

 1  private   static  List < Birthday >  ListBirthday  =   new  List < Birthday >
 2                                                                  {
 3                                                                    new  Birthday { Month  =   3 , Day  =   4  },
 4                                                                    new  Birthday { Month  =   3 , Day  =   5  },
 5                                                                    new  Birthday { Month  =   3 , Day  =   8  },
 6                                                                    new  Birthday { Month  =   6 , Day  =   4  },
 7                                                                    new  Birthday { Month  =   6 , Day  =   7  },
 8                                                                    new  Birthday { Month  =   9 , Day  =   1  },
 9                                                                    new  Birthday { Month  =   9 , Day  =   5  },
10                                                                    new  Birthday { Month  =   12 , Day  =   1  },
11                                                                    new  Birthday { Month  =   12 , Day  =   2  },
12                                                                    new  Birthday { Month  =   12 , Day  =   8  },
13          };        
14  private   static   int [] SinDays  =   new   int []{ 2 , 7 };    


入口方法:

 1  static   void  Main( string [] args)
 2          {
 3              ConditionOne();
 4              ConditionTwo();
 5              ConditionThree();
 6               if  (ListBirthday.Count  ==   0 )
 7              {
 8                  Console.WriteLine( " 给出的条件有误,请确认 " );
 9                  Console.Read();
10                   return ;
11              }
12               foreach  (Birthday bd  in  ListBirthday)
13              {
14                  Console.WriteLine(bd.ToString());
15              }
16              Console.Read(); 
17          }


条件一处理逻辑:

 1  static   void  ConditionOne()
 2          {
 3              List < Birthday >  DelBirthday  =   new  List < Birthday > ();
 4              List < int >  DelMonths  =   new  List < int > ();
 5               // 根据独立天,查找对应的月份,并放入 DelMonths中
 6               foreach (Birthday bd  in  ListBirthday)
 7              {
 8                   for  ( int  i  =   0 ; i  <  SinDays.Length; i ++ )
 9                  {
10                       if  (bd.Day  ==  SinDays[i])
11                      {
12                           if  ( ! DelMonths.Contains(bd.Month))
13                          {
14                              DelMonths.Add(bd.Month);
15                          }
16                           break ;    // Break 终止循环 因为一个日期不会存在两天. 终止循环后可以减少循环次数                     
17                      }
18                  }
19              }
20               // 根据月份,查询将要删除的日期. 并放入 DelBirthday中
21               foreach  (Birthday bd  in  ListBirthday)
22              {
23                   foreach ( int  TempM  in  DelMonths)
24                  {
25                       if  (bd.Month  ==  TempM)
26                      {
27                          DelBirthday.Add(bd);
28                           break // 与上同理      
29                      }
30                  }
31              }
32               // 删除日期
33               foreach  (Birthday bd  in  DelBirthday)
34              {
35                  ListBirthday.Remove(bd);
36              }
37          }


条件二处理逻辑:

 

 1           ///   <summary>
 2           ///  小强说:刚才我不知道,但现在我知道了 
 3           ///  分析:由条件一得出的结果,现在小强知道的天应该是集合中单一的天.
 4           ///  固: 除去重复的天       
 5           ///   </summary>
 6           static   void  ConditionTwo()
 7          {
 8              List < Birthday >  DelDays  =   new  List < Birthday > ();
 9              List < int >  TempDays  =   new  List < int > ();
10              List < int >  TempDays1  =   new  List < int > ();
11               foreach  (Birthday bd  in  ListBirthday)
12              {
13                   if  ( ! TempDays.Contains(bd.Day))
14                  {
15                      TempDays.Add(bd.Day);
16                  }
17                   else
18                  {
19                      TempDays1.Add(bd.Day);
20                  }
21              }
22               foreach  (Birthday bd  in  ListBirthday)
23              {
24                   foreach  ( int  Num  in  TempDays1)
25                  {
26                       if  (bd.Day  ==  Num)
27                      {
28                          DelDays.Add(bd);
29                           break ;
30                      } 
31                  }               
32              }
33               // 删除日期
34               foreach  (Birthday bd  in  DelDays)
35              {
36                  ListBirthday.Remove(bd);
37              }
38          }


条件三处理逻辑:

 1  ///   <summary>
 2           ///  小明说,那我也知道了
 3           ///  
 4           ///  分析: 月份不能相同
 5           ///   </summary>
 6           static   void  ConditionThree()
 7          {
 8              List < Birthday >  DelMonths  =   new  List < Birthday > ();
 9              List < int >  TempMonths  =   new  List < int > ();
10             
11              List < int >  TempMonths1  =   new  List < int > ();
12 
13               foreach  (Birthday bd  in  ListBirthday)
14              {
15                   if  ( ! TempMonths.Contains(bd.Month))
16                  {
17                      TempMonths.Add(bd.Month);
18                  }
19                   else
20                  {
21                      TempMonths1.Add(bd.Month);
22                  }
23              }
24               foreach  (Birthday bd  in  ListBirthday)
25              {
26                   foreach  ( int  Num  in  TempMonths1)
27                  {
28                       if  (bd.Month  ==  Num)
29                      {
30                          DelMonths.Add(bd);
31                           break ;
32                      }
33                  }
34              }
35               // 删除日期
36               foreach  (Birthday bd  in  DelMonths)
37              {
38                  ListBirthday.Remove(bd);
39              } 
40          }

运行结果:  9月1日    

源码下载地址:

源码

转载于:https://www.cnblogs.com/ybhcolin/archive/2010/09/25/1834713.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值