工作流:小明和小强都是张老师的学生
好久没上网了发贴了,看到有人发这道题,就用工作流的解决方式作一下吧
小明和小强都是张老师的学生,张老师的生日是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;
}
}
好久没上网了发贴了,看到有人发这道题,就用工作流的解决方式作一下吧
小明和小强都是张老师的学生,张老师的生日是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;
}
}