一、誠實人與說謊者
問題:
兩個箱子,一個有財寶,另一個沒有;
有一個誠實人和一個說謊者,他們都知道哪個箱子有財寶;
但你不知道哪個是誠實人哪個是說謊者
如何問他們兩人問題,確定哪個箱子有財寶。
答案:
“如果問另一個人,哪個箱子有財寶,對方會怎么回答?”
分析:
可以把問題改為“如果問另一個人,箱子A有財寶是對的嗎”
“箱子A有財寶"這是一個斷言A。斷言A可能為真或假
假如有兩個布爾函數F和G,存在2種情況:
1、F(x) = x,G(x) = not x ?
2、F(x) = not x,G(x) = x?
要求用F和G構造一個函數H(x)=x
那么H(x)可以為H(x) = not F(G(x))
二、善變者
問題:
善變者----初始狀態隨機,可以為誠實人,也可以為說謊者。其每次回答一個問題后,就切換狀態,從城市人轉換為說謊者,或從說謊者轉換為誠實人。
五個人,四個善變者,一個誠實人。
能問兩個問題,可以對同一個人問兩個問題,或找兩個人分別問一個問題。
如何找到誠實人。
答案:
問題一:你是誠實人嗎?
問題二:問題一回答“是”(這輪肯定是誠實人) 你們當中誰是誠實人?
問題一回答“不是”(這輪肯定不是誠實人) 你們當中誰不是誠實人?
分析:
問題二的第二個問的問法很有技巧。不過找不到比較合適的“數學”表示法
三、外星人來襲!
問題:
100個人,排隊,每人一頂帽子,帽子可能是紫色也可以是綠色。第i個人可以看見前i-1個人的帽子。
從第100個人開始至第1個人報帽子的顏色,如果他報錯了,則咔擦掉,如果報對了,則平安。
問用什么樣的策略報數,可以使得掛掉的人最少。
答案:
第100個人,如果前99個人紫色帽子的個數是奇數,則報紫色,否則報綠色。
對于1-99中的第i個人
1、他知道前i-1個人的紫色帽子個數是否是奇數;
2、如果第i+1至99報數的人都正確,那么他知道從i+1至99的紫色帽子個數是否是奇數;
3、根據第100個人,他知道前99個人中的帽子個數是否是奇數;
根據前面3個條件,第i個人可以計算出他頭上帽子是什么顏色的。
(注意第99個人我們可以認為從i+1至99中沒有人,也就是紫色帽子的個數是0,為偶數)
聯想:
用布爾運算表示會顯得更“準確”點,有點類似一個結構體用一個指針卻要表示雙向鏈表的方法。
四、藍額頭房間
問題:
100個邏輯學家參與游戲。
游戲規則:
1、100個邏輯學家蒙眼被帶進房間,然后至少一個邏輯學家額頭被涂成了藍色。最后去掉蒙眼布。
2、然后不斷的關燈,開燈;在關燈的時候,如果某個邏輯學家推斷出他是藍額頭,那么他離開房間。
3、全部藍額頭的人離開房間后,游戲結束。
如果每個人都被涂了藍額頭,會發生什么?
答案:
在第100次關燈的時候,全部人同時離開房間。
分析:
假如只有一個人是藍額頭,那么第一輪他會離開房間;
假如有2個人是藍額頭,那么第一輪沒有人離開房間。而這2個人只看到一個藍額頭,那么他會在這一輪離開房間。(他會這樣推理,另外那個藍額頭的人除非看到了自己是藍額頭,否則他會在上一輪離開房間)
以此類推。。
擴展:
http://www.newsmth.net/bbscon.php?bid=51&id=155695
一個島上有100個人,其中有5個紅眼睛,95個藍眼睛。這個島有三個奇怪的規則。
1. 他們不能照鏡子,不能看自己眼睛的顏色。
2. 他們不能告訴別人對方的眼睛是什么顏色。
3. 一旦有人知道了自己是紅眼睛,他就必須在當天夜里自殺。
某天,有個旅行者到了這個島上。由于不知道這里的規矩,所以他在和全島人一起狂歡
的時候,不留神就說了一句話:"你們這里有紅眼睛的人。"
假設這個島上的人足夠聰明,每個人都可以做出縝密的邏輯推理。請問這個島上將會發
生什么?
陶哲軒說,這個旅行者事實上講了一句廢話,沒有帶來任何新的信息。因為這島上有95個藍眼睛,5個紅眼睛。每個人都知道這島上有紅眼睛的人。無非是藍眼睛的人看到有5個紅眼睛,紅眼睛的人看到有4個紅眼睛而已。旅行者說的那句"島上有紅眼睛的人",沒有輸入任何新的信息,他說的就是島上的人每天都看到的景象。所以哪怕島上的人思維再縝密嚴謹,也不會有任何自殺的情況發生。
(神和人的區別太明顯了。。)
五、占位符
課程上對應的第5節是“藍額頭房間”的分析
六、數字額頭游戲
問題:
把3個邏輯學家放進房間里面,在3個邏輯學家頭上寫上3個不同的數字,其中某個數字是其他兩個數字之和。
A看見了B額頭上寫了20, C額頭上寫了30
A:我不知道我頭上寫的是多少?
B:我也不知道
C:我也不知道
A:我知道了
問:A額頭上寫的是多少?
答案:
A看到20和30=>A知道他頭上的數組不是10就是50
1、如果A頭上的數是10
B看到10和30=>那么B會知道他頭上的數字不是20就是40
C看到10和20=>C會知道他頭上的數字不是10就是30;但由于3個數都不相同,那么C會知道他頭上的數字就是30,那么C能確定他頭上的數字是30
結論:A頭上的數字不是10,那么就只會是50
聯想:
如果復雜到一定程度,人腦容不下這么復雜狀態,怎么寫程序解?
七、燈亮or燈滅
問題:
100個燈泡,起始全是滅的。
執行100次步驟:第i次步驟,對i,2*i,3*i 。。的燈全部切換一下開關(滅的開等,亮的關燈)
最后有多少燈是亮的
答案:
對第n個燈,假如他有k個因子,那么他會被切換k次開關;但k為奇數時,這個燈會是亮的。而只有平方數是有奇數個因子,100里面有10個平方數,所以答案為10
八、路徑計算
問題:
n*m網格,從(1,1)走到(n,m)有多少種走法?只能向下或向右走一步
答案:
組合數C(n+m-2, n - 1)。
視頻里面居然先用二維遞推解一遍,然后又用母函數解一遍
分析:
從(1,1)走到(n,m)需要n+m - 2步,其中有n-1步是向下的
聯想:
用來了解下遞推或母函數也是不錯的
九、三維路徑計算
問題:
x*y*z正方體,從(1,1)走到(x,y,z)有多少種走法?只能向下或向右走一步
解法:
同上題
聯想:
如果是在正方體表面行走,似乎遞推方便點,用組合數比較麻煩。