小明和小強都是張老師的學生,張老師的生日是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日
小明說:如果我不知道的話,小強肯定也不知道
小強說:本來我也不知道,但是現在我知道了
小明說:哦,那我也知道了
請根據以上對話推斷出張老師的生日是哪一天
參考答案:
生日是9月1日
解題思路:
由小明第一句話可知,此月可能爲3月或9月。因爲6月有個7日,12月有個2日,如果M爲6或12的話,小強有可能知道,而小強肯定不知道。
由小強的話可知,此日可能爲1日、4日或8日。因爲如果N爲5的話,小強無法判斷是3月5日還是9月5日,而不會說現在我知道了。
由小明第二句話可知,此月必爲9月。因爲如果是3月,小明無法判斷是3月4日還是3月8日,而他說那我也知道了。
綜上所述,生日是9月1日。
參考答案:
生日是9月1日
代碼大概是:
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;
}
}
月薪三萬的面試題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.