又是一年找工作的高峰期,各種各樣千奇百怪的智力題也在考驗著學子們的智商,其中有些題目更是讓人腦細胞大量死亡。。。近來有同學問一道,帶有說謊的猜數字遊戲,問“元芳,這事你怎麼看?”,我這想一口鹽汽水噴死他。好了,言歸正傳。
問題描述:
A,B兩名玩家首先約定正整數N,然後A在心裡想一個正整數x,其中x在1和N之間,B通過提問來猜出A心中所想的數字x。B提問的格式只有一種:先列出一些數字,然後問“x”是否在這些數字中(當然B也可問:x是否在某個區間內),B可以提問任意多次,A可回答“是”或者“否”。A可以偶爾撒謊的,但是A不能連續兩次撒謊。問:B是否可以通過詢問得到A心中的所想的數字,或者給出一個集合保證A所想數字x必定落在次區間內,如果能請給出策略;如果不能請說明理由。
問題解答:
乍一看這個問題確實比較棘手,不知道從何開始,再次情況下,先求解簡單的特殊情況,然後逐步歸納得到一般地結論,是一個不錯的選擇。因而我們可以從最簡單的情況考慮,假設N=2,那麼A所想的數字要麼是1要麼2.這種情況下如何呢?
由於A不可能連續說謊,所以如果對於同一個問題連續問兩次,A兩次給出相同的答案,那麼我們是可以猜出答案的。比如:B連續兩次提問“x=2嗎?”,A如果給出答案“是是”,那麼A兩次必然都說真話,所以x=2;如果A回答“否否”,那麼兩次“否”也是真話,因而斷定x不等於2,x=1。
然而A給出不能的答案,B連續兩次提問”x=2嗎?“,A回答“是否”,我們只能斷定有一次說了假話,不能斷定哪一次說了假話,因而得不到任何有用的資訊。在此基礎上,如果再問“x=1嗎?”,A可以根據上次說真話還是假話來給出回答,如果上次說的假話,那麼只要保證這次說的是真話就可以了,但是我們並不知道他是否正在說真話,因而還是得不到有用的資訊;如果上次說的真話,那麼這次真話假話都可以,就可以隨便答,如果繼續逼問”x=1嗎?“,A上次說”是“,這次就說”否“,上次說”否“,這次就說”是“,我們是無論如何都不可能知道他什麼時候在撒謊的。因而如果只有兩個值,那麼B是不可能通過提問來猜出x的。
上面的過程可以通過下面這個簡單的例子看出,假設x=2。
(1)”x=2嗎?“ ”是“ ”x=2嗎?“ "否" ”x=2嗎?“ ”是“。。。(交替回答即可)。。。。”x=1嗎?“ ”是/否“(上次說真話,這次隨便) ”x=1嗎?“ ”否/是“
(2)"x=2嗎?" "否" ”x=2嗎?“ ”是“ ”x=2嗎?“ ”否“。。。。(交替回答即可)。。。”x=1嗎?“ ”否“(上次說假,這次必須說真) ”x=1嗎?“ ”是“
因為1和2是稱的,如果接著問”x=2嗎?“,只需要把上述(1)(2)中回答1和2的策略交換即可。
----------------------------------------------------------------------------我是分割線---------------------------------------------------------------------
N=2是不能斷定的,那麼N=3情況會是怎麼樣的呢?A只能想123中的某一個數。同樣根據A不能連續說謊兩次,我們可以對一個問題重複問2次以上,如果A的回答是相同的,那麼必然是可以得到資訊的。
例如連續問”x=3嗎?“,A的回答方式只可能是”是是“ ”否否“”是否“”否是“這四種情況。
(1)如果A回答”是是“,立刻斷定兩次都為真話,因而x=3.
(2)如果A回答”否否“,立刻斷定兩次都為真話,因而x不等於3,可排除3.
(3)如果A回答”否是“,繼續問”x=2嗎?” A只能回答“是/否”,分情況討論:(3a)如果A回答“是”。也就是“x=3嗎?”“是”“x=2嗎?”“是”。由於兩者中至少有一真,有不可能都是真(x不能即等於2也等於3),所以兩者中必有一真一假。這樣可以得出x要麼等於2要麼等於3,因而可以排除1。(3b)如果A回答是“否”,也就是“x=3嗎?”“是”“x=2嗎?”“否”。這時如果x=2,那麼可以得出他兩次都說假話。因而可以得出x不等於2,即可以排除2.
(4)如果A回答“是否”,繼續問“x=3嗎?”,如果回答“否”,按情況(2)處理,如果回答“是”,按情況(3)處理。
因而通過上面的提問策略我們總是可以排除其中的一個數,在大多數情況下不能得到更多的資訊,除了情況(1)可直接得到答案。
----------------------------------------------------------------------------我是分割線-------------------------------------------------------------------------
現在我們開始考慮原始問題,如果N比較大怎麼辦呢?我們可以把N分成三等分(不一定要求相等,盡量即可),這樣把上面的策略中的123,換成集合123即可,比如“x在第三個集合中嗎?”,這樣的話,我們每次可以淘汰1/3的所有數字,直到最終剩下兩個數字,就歸結為第一個小問題,不可能得到確定的某一個數字。
本來討論到這裡已經結束了,但是有同學說,其實這個問題Matrix67已經有討論過,並且還有更一般的結論,有興趣的同學請點擊這裡。
<注>博主python27對本部落格文章享有著作權,轉載請註明出處,對解題思路有任何建議,歡迎在評論中告知。