乙個邏輯問題的分析 「天堂與地獄的守衛」

2021-07-04 08:54:41 字數 2493 閱讀 7523

** : 

最近和朋友討論乙個邏輯問題,據說也是個以前出現過的面試題了。拿出來和大家分享。

問題如下:

你來到兩道門口,一道是天堂之門, 一道是地獄之門 。

門口都有乙個守衛,只知道守衛乙個只說假話,乙個只說真話。

現在你只有一次提問機會,只向乙個守衛問乙個問題,這個守衛對你的問題,只給出「是」或者」不是「的答案。(對於無法給出是非的問題,守衛會直接把你砍死。。。)

請問怎麼問才能準確進入天堂之門?

我們將守衛守門的所有情況列成如下的乙個矩陣:

守衛分兩種情況,第一行代表天堂守衛是誠實的情況,第二行分為天堂守衛為說謊話的情況。

而每種情況你都有2個可能,要麼問到真話守衛,要麼問到假話守衛。因此問題的解空間是乙個2*2的矩陣。

這個問題難在,不管你問「你是說真話的嗎?」還是問「

你守衛的門是天堂的嗎?」,都無法得到滿意資訊。

如下圖,如果你問「你守衛的門是天堂的嗎?」,所有的情況如下圖所示:

紅色的勾表示如果你問這個守衛(勾連線的那個畫圈的守衛)問題,他會說「是」。」叉「表示說」否「。

看到這個圖你就明白為什麼問不出答案了。因為無論是上下哪種情況,天堂的守衛既有可能說」是「,也有可能說」不是「。

我們的目的是找出天堂之門。也就是說,需要設計乙個問題,將解空間按照天堂和地獄來進行分離

也就是說,我們需要設計乙個問題,將解空間分解為如下情況:

這樣解空間按照天堂和地獄分開了。只要回答是」是「,該守衛就是天堂守衛。反之就是地獄守衛。

如何尋找這樣的問題呢?

容易知道,為得到天堂地獄相關的資訊,我們問的問題一定是描述當前守衛守門狀況的乙個描述。(例如你問1+1=2嗎,真話守衛說是,假話守衛說否,這樣只能區分出守衛真假,但是無法區分天堂和地獄)

如果我們把這個狀態當做函式的輸入x,守衛對該問題的回答的解空間當做y,那麼這個函式可以寫作:

y = f(x)

由於y和x是2*2的矩陣。那麼可把上式寫成:

那麼f函式執行的是什麼操作呢?

我們知道,x表示的是乙個描述在四種守衛情況中的真值表,真值表是客觀存在的,所以一定是為真的。真話守衛不會修改這個真值,而謊話守衛一定會給出相反結果。那麼,這個

f可以表示為:

由於f只做了反轉操作,顯然

f操作是可逆的。

要讓天堂守衛都說」是「,地獄守衛都說」否「,就是說y應該是:y1=y3=1, y2=y4=0。

既然我們已經知道我們需要什麼樣的y了。因此,已知

y反求x,如下:

這個x就是我們可以拿出來問守衛的問題。

還記得我們對矩陣的定義嗎?

因此,把上面的x代入該矩陣定義,得到如下的守衛狀態

守天堂的

是真話守衛;    守地獄的

是假話守衛;

守天堂的

不是假話守衛;守地獄的

不是真話守衛;

這實際上是乙個狀態的四個等價描述的。因此,這個狀態就是滿足輸出y的問題x。

因此,只要向任意乙個守衛問上面的任意乙個問題即可。只要回答是」是「,該守衛就是天堂守衛。反之就是地獄守衛。

假設說真話的守衛對問題的回答為f=t(x),假話的為f=f(x),那麼有:

t(0) = 0, t(1) = 1;

f(0) = 1, f(1) = 0;

注意到:

t(f(0)) = 1; t(f(1))=0;

f(t(0)) = 1; f(t(1))=0;

這說明通過乙個問題x經過f和t的兩次加工,最後的答案是一樣的也即

t(f(x)) = f(t(x)) = !x

因此,我們可以構造如下問題:

另外那個守衛會告訴我你是天堂守衛嗎?

得到的回答一定和」你是天堂守衛「相反。也就是說,他說」是「,那他就是地獄守衛;他說不是,那他就是天堂守衛。

乙個邏輯問題的分析 「天堂與地獄的守衛」

最近和朋友討論乙個邏輯問題,據說也是個以前出現過的面試題了。拿出來和大家分享。問題如下 你來到兩道門口,一道是天堂之門,一道是地獄之門 門口都有乙個守衛,只知道守衛乙個只說假話,乙個只說真話。現在你只有一次提問機會,只向乙個守衛問乙個問題,這個守衛對你的問題,只給出 是 或者 不是 的答案。對於無法...

乙個選擇問題的分析

設有一組n個數,要確定其中第k個最大者,這稱為選擇問題 selection problem 該問題的一種解法是將這n個數讀進乙個陣列中,再通過某種簡單的演算法,比如氣泡排序,以遞減順序將陣列排序,然後返回位置k上的元素。更好一點的演算法可以先把前k哥元素讀入陣列中並 以遞減的方式 進行排序。接著將剩...

乙個執行緒死鎖問題的分析

客戶報過來乙個問題,伺服器執行一周左右就會停止響應,有時候甚至兩天就不響應了,併發使用者量並不大,重啟服務後又工作正常。每當遇到這種問題時就有點兒棘手。一是這種問題的復現條件不好確定,另一方面,即使確定了條件,對於多執行緒的服務程式,也不好除錯。我遇到過的這種問題,大部分是靠讀 分析出來乙個可能的原...