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

好久没上网了发贴了,看到有人发这道题,就用工作流的解决方式作一下吧
小明和小强都是张老师的学生,张老师的生日是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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器