您的位置:首页 > 其它

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

2011-06-09 15:37 190 查看
工作流:小明和小强都是张老师的学生




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

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐