【趣味數學】可以說謊的猜數字遊戲

來源:互聯網
上載者:User

  又是一年找工作的高峰期,各種各樣千奇百怪的智力題也在考驗著學子們的智商,其中有些題目更是讓人腦細胞大量死亡。。。近來有同學問一道,帶有說謊的猜數字遊戲,問“元芳,這事你怎麼看?”,我這想一口鹽汽水噴死他。好了,言歸正傳。

問題描述:

  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對本部落格文章享有著作權,轉載請註明出處,對解題思路有任何建議,歡迎在評論中告知。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.