小明和小强都是张老师的学生,张老师的生日是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日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天
是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
小明说:如果我不知道的话,小强肯定也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天
1)首先分析这10组日期,经观察不难发现,只有6月7日和12月2日这两组日期的
日数是唯一的。由此可知,如果小强得知的N是7或者2,那么他必定知道了老师的
生日。
2)再分析“小明说:如果我不知道的话,小强肯定也不知道”,而该10组日期的
月数分别为3,6,9,12,而且都相应月的日期都有两组以上,所以小明得知M后
是不可能知道老师生日的。
3)进一步分析“小明说:如果我不知道的话,小强肯定也不知道”,结合第2步
结论,可知小强得知N后也绝不可能知道。
4)结合第3和第1步,可以推断:所有6月和12月的日期都不是老师的生日,因为
如果小明得知的M是6,而若小强的N==7,则小强就知道了老师的生日。(由第
1步已经推出),同理,如果小明的M==12,若小强的N==2,则小强同样可以知道老师的生日。即:M不等于6和9。现在只剩下“3月4日 3月5日 3月8日 9月1日
9月5日”五组日期。而小强知道了,所以N不等于5(有3月5日和9月5日),此时,
小强的N∈(1,4,8)注:此时N虽然有三种可能,但对于小强只要知道其中的
一种,就得出结论。所以有“小强说:本来我也不知道,但是现在我知道了”,
对于我们则还需要继续推理
至此,剩下的可能是“3月4日 3月8日 9月1日”
5)分析“小明说:哦,那我也知道了”,说明M==9,N==1,(N==5已经被排除,3月份的有两组)
{
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;
} }
火龙果
等 级:
发表于:2008-02-26 17:30:559楼 得分:0
我记得这题原来只有1万,现在涨成3万了啊?
======================================
連方便面都長了3毛,跟何況這道題目?
現在只有工資是部長的啊
测试Java代码!!
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;
}
朱能文
等 级:
发表于:2008-02-27 17:34:5027楼 得分:0
3月4日 3月8日 何尝不可? 看看题中的组合
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日 既然小强通过小明的话排除了6月和12月 那么除了3月和9月重复的5日不能确定外,这两个月内4日、8日、1日都是唯一的了,也就是说小强可以确定3月4日、3月8日、9月1日中的任何一日,题目中的最后“小明说:哦,那我也知道了”没有道理,此题有问题,出题的师傅没有考虑周全
好像有问题回头我解答
(没有这句话,小强的“知道”也是不能确认的,这最后一句是整个判断必不可少的)
step2: 因第一句“如果我不知道的话,小强肯定也不知道” 可排除6月7日step3: 现在只有6月4日、9月1日、 9月5日三个日期了,很简单,只有1日是所有日子里唯一的(4,5不唯一,他们也不可能“知道”)
我样是不是这个题变得很简单了? :)
好强呀!
请问你是从事什么工作的?
public static void main(String[ ] args){
int[ ] yue = { 3, 3, 3, 6, 6, 9, 9, 12, 12, 12 }; int[ ] ri = { 4, 5, 8, 4, 7, 1, 5, 1, 2, 8 }; boolean[ ] r = { true, true, true, true, true, true, true, true, true, true }; int[ ] temp = new int[ 13 ];
for (int i = 0; i <ri.length ; i++) {//小明说:如果我不知道的话,小强肯定也不知道 得知,日期只出现一次的日期一定不是。
temp[ ri[ i ] ]++;
}
for (int i = 0; i < temp.length; i++) {//确定出来一定不符合题意的日期,标记为 false
if (temp[ i ] == 1){
for (int j = 0; j < ri.length; j++) {
if (i == ri[ j ]){
r[ j ]=false;
}
}
}
}
for (int i = 0; i < r.length; i++) {//划掉上面日期对应的月份
if (!r[ i ]){
for (int j = 0; j < yue.length; j++) {
if (yue[ i ] == yue[ j ]){
r[ j ] = false;
}
}
}
}
temp = new int[ 13 ];//初始化数组
for (int i = 0; i < r.length; i++) {//划掉上面日期对应的月份
if (r[ i ]){
temp[ ri[ i ] ]++;
}
}
for (int i = 0; i < temp.length; i++) {//由于:小强说 本来我也不知道,但是现在我知道了 可知:剩下的数据中,日期重复的可以划掉。
if (temp[ i ] > 1){
for (int j = 0; j < ri.length; j++) {
if (i == ri[ j ]){
r[ j ]=false;
}
}
}
}
temp = new int[ 13 ];//初始化数组
for (int i = 0; i < r.length; i++) {//划掉月份上重复的数据。就是答案了
if (r[ i ]){
temp[ yue[ i ] ]++;
}
}
for (int i = 0; i < temp.length; i++) {
if (temp[ i ] > 1){
for (int j = 0; j < yue.length; j++) {
if (i == yue[ j ]){
r[ j ]=false;
}
}
}
}
for (int i = 0; i < r.length; i++) {
if (r[ i ]){
System.out.println("生日的日期是" + yue[ i ] + "月" + ri[ i ] + "日");
}
}
}
}
是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
(1)小明说:如果我不知道的话,小强肯定也不知道
(2)小强说:本来我也不知道,但是现在我知道了
(3)小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天 其实另一种6月4号也是对的
<1>先看第2句(小强说的:本来我也不知道,但是现在我知道了)
"本来我也不知道":说明老师告诉他的这天不是唯一的(把6月7日,12月2日去掉)
现在我门得到的结果是
3月4日 3月5日 3月8日
6月4日
6月7日9月1日 9月5日
12月1日
12月2日12月8日<2>在看第1句(小明说:如果我不知道(这个月)的话,小强肯定也不知道(生日))
我门反想下(小明说:如果我知道的话,小强可能就知道了)
(1)假设下:小明知道的这个月是3(3个日期),9(2个日期),12(2个日期)
小强还是肯定不知道生日是哪天,因为这3个月的日期都有2个以上;
我门在顺过来想下:只有小明的月是6的时候,小强才可能知道;所以当小明说了以后,小强就确定下了一个日期,因为6月就一个6月4日了
所有更加坚定了我6月4号的想法,9月1号反而有漏洞.
因为( 小明说:如果我不知道的话,小强肯定也不知道 得知,日期只出现一次的日期一定不是。
只能说明:6月7号和12月2号这两个日期不是
为什么要把所有6月和12月的日期都排除呢?)
3月4日 3月5日 3月8日 6月4日 6月7日
9月1日 9月5日 12月1日 12月2日 12月8日 M 月份有: 3 ,6, 9 ,12 N 日有:1, 2, 4, 5, 7, 8,
9 12 3 3 6 3
12 6 9 12
小明知道M.
小紅知道N.
小明说:如果我不知道的话,小紅肯定也不知道
小明为什么敢这样说呢? N 1, 2, 4, 5, 7, 8,
M 9 12 3 3 6 3
M 12 6 9 12
假设如果是2日,小明就不用说就知道生日了(小明之前不知道生日:因为他后面说”哦,那我也知道了“)。所以排除2N,12M和6M
1.小明会想是哪一日呢? N 1, 4, 5, 8,
M 9 3 3 3
M 9
2.小红会想现在就3M和9M了。是哪一月呢?
M 3, 9
N 4 1
N 5 5
N 8 小明说了这句话后小紅说:本來我也不知道,但是现在我知道了 .
把12M和6M给排除了后小紅就知道答案了! 显然5日排除。如果是5日小紅是不知道答案的。
N 1, 4, 8,
M 9 3 3 M 3, 9
N 4 1
N 8
再显然3日排除。如果是3日小紅会有4月还是9月的选择,也是不知道答案的。
小明接着就说:哦,那我也知道了 。也说明了排除3日这一点。 所以老师的生日就是9月1日了。您理解了吗! 呵呵。还是在纸上画方便些。
A 只会拿到 3、6、9、12 四个中的一个。无论拿到哪一个都不会知道生日是哪一天,那么他就会判断 B 拿的是什么。-------------------------------------------------------------
先来看第一句话。在什么情况下 A 会这样说?
-------------------------------------------------------------
如果 A 拿的是 3:
则 B 只会拿到 4、5、8 三个中的一个。
如果 B 拿的是 4,则有 3月4日 和 6月4日 两个日期,所以 B 不知道会是哪一个。
同理,如果B拿的是5和8也不会知道。
结论:A 会说出“如果我不知道的话,小强肯定也不知道”的话。如果 A 拿的是 6:
则 B 只会拿到 4、7 中的一个。
如果 B 拿的是 7,那么 B 就知道了;如果拿的是 4,就不会知道。
结论:B 有可能知道,所以 A 不会说出“如果我不知道的话,小强肯定也不知道”的话。由此可知 A 不可能拿的是 6。如果 A 拿的是 9:
则 B 只会拿到 1、5 中的一个。1也好,5也好,都有重复,所以 B 都不会知道。
结论:A 会说出“如果我不知道的话,小强肯定也不知道”的话。如果 A 拿的是 12:
则 B 只会拿到 1、2、8 中的一个。如果拿的是 2,那么 B 就会知道;如果拿 1 和 8 就不会知道。
结论:B 有可能知道,所以 A 不会说出“如果我不知道的话,小强肯定也不知道”的话。由此可知 A 也不可能拿的是 12。以上分析得出 A 拿是 3 或 9。
由此可以知道 B 拿的肯定是 1、4、5、8 中的一个,同时 B 也根据 A 的话得出 A 拿的是 3 或 9。
那么结果肯定在以下几个日期中:
3月4日3月5日3月8日
9月1日9月5日
======================================================================-------------------------------------------------------------
再来看第二句话。在什么情况下 B 会这样说?
-------------------------------------------------------------
如果 B 拿的是 1:
则 A 拿的肯定是 9。由此 B 就知道了生日是 9月1日。
结论:B 会说出“本来我也不知道,但是现在我知道了”的话。如果 B 拿的是 4:
则 A 拿的肯定是 3。由此 B 就知道了生日是 3月4日。
结论:B 会说出“本来我也不知道,但是现在我知道了”的话。如果 B 拿的是 5:
则 A 拿的是 3、6 中的一个,所以 B 不可能知道。
结论:B 不会说出“本来我也不知道,但是现在我知道了”的话。由此可知 B 拿的不是5。如果 B 拿的是 8:
则 A 拿的肯定是 3。由此 B 就知道了生日是 3月8日。
结论:B 会说出“本来我也不知道,但是现在我知道了”的话。以上分析得出 B 拿的是 1、4、8 中的一个。
那么结果肯定在以下几个日期中:
3月4日3月8日
9月1日======================================================================-------------------------------------------------------------
分析到此还未得出结果,关键在第三句话。
从第一句话的分析结果得知,A 拿的是 3 或 9。那么在什么情况下 A 会说出“哦,那我也知道了”的话呢?
-------------------------------------------------------------
如果 A 拿的是 3:
则结果可能是 3月4日 或 3月8日,那么 A 就不会知道。
结论:A 不会说出“哦,那我也知道了”的话。由此可知 A 拿的不是 3。如果 A 拿的是 9:
则结果肯定是 9月1日。
结论:A 会说出“哦,那我也知道了”的话。以上分析得出 A 拿的是 9。由此可以得知,最终答案是:9月1日。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Triumph/archive/2008/03/30/2231716.aspx
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
因为 小明说:如果我不知道的话,小强肯定也不知道
所以 推断小明知道的月里面肯定不存在唯一可推断的日 这样可以得到小明拿的M是3和9因为 小强通过小明的上句话知道了M是3或9,而且知道N
当小强说:本来我也不知道,但是现在我知道了
可以反推如果小强手中的N是5,那么他就不可能知道日期这时可以选择的数据有 3月4日 3月8日 9月1日
因为 小明说:哦,那我也知道了
假设小明的M是3,那么他依然不知道日期
所以推断M是9 N是1
是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
小明说:我不知道,但我敢肯定小强也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天
3月4日 3月5日 3月8日
6月4日 6月7日
9月1日 9月5日
12月1日 12月2日 12月8日
小明说:我不知道,但我敢肯定小强也不知道
小强说:本来我也不知道,但是现在我知道了
小明说:哦,那我也知道了
请根据以上对话推断出张老师的生日是哪一天