月薪三萬的面試題

小明和小強都是張老師的學生,張老師的生日是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;
}

}

發佈了27 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章