zoukankan      html  css  js  c++  java
  • 工作流:小明和小强都是张老师的学生......

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

    小明和小强都是张老师的学生,张老师的生日是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;
            }


        }




  • 相关阅读:
    洛谷 P2888 [USACO07NOV]牛栏Cow Hurdles
    洛谷 P2935 [USACO09JAN]最好的地方Best Spot
    CODEVS 1172 Hankson 的趣味题
    洛谷 P2261 [CQOI2007]余数求和
    洛谷 P1463 [POI2002][HAOI2007]反素数
    洛谷 P3383 【模板】线性筛素数
    1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性
    HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例
    将字符转换为unicode码
    solrj-WiKi
  • 原文地址:https://www.cnblogs.com/foundation/p/675073.html
Copyright © 2011-2022 走看看