|  | 
 
.gif) 发表于 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 编辑 ]
 | 
 |