工作流:小明和小强都是张老师的学生......

好久没上网了发贴了,看到有人发这道题,就用工作流的解决方式作一下吧

小明和小强都是张老师的学生,张老师的生日是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.小明说:如果我不知道的话,小强肯定也不知道
小明能肯定小强不知道,那就说明小强拿到的肯定不是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;
        }


    }




posted @ 2007-03-14 20:55  WXWinter(冬)  阅读(15709)  评论(43编辑  收藏  举报