當前位置:編程學習大全網 - 網絡軟體 - 求猜數字遊戲的策略

求猜數字遊戲的策略

妳好!

先來壹個比較簡單的

第壹步先猜0001,2223,4445,6667,8889。既可判斷是那四個數比如1、3、5、0

第二步選壹個沒有出現的數比如9,將它與前面四個中的壹個組合,判斷其位置

比如1999,9199,9919可判斷1(前三個都不是就是第四個,下同)

第二個數需兩次,第三個需壹次,剩下的是最後壹個

這樣,最壞的情況只需11次,有點多,最大的優點是不需要動腦子

關於上述策略的改進

在第二步用兩個確定出現的數,比如0和1,以0001的方式輸入,有以下3種情況:

1A3B,0和1壹定都不在第四位(因為這“1A”壹定是0,如果是1,則0壹定在前三位,會有2A,故1不在第四位,同樣因為“1A”是0,0也不是第四位。),這樣剩下兩個數壹定有壹個在第四位,剩下兩個數,比如2、3,以2232的方式輸入,如果3是第三位,則會顯示2A2B,否則是4B,這樣三四兩位就定下來了,再猜壹次可以確定壹二兩位的順序,9次壹定可以猜對

2A2B,1壹定是第四位,0壹定不是第四位

4B,0壹定是第四位,1壹定不是第四位

上面兩種情況是等價的,第壹次就可以確定壹個數的位置,假設第四位是1,下壹次猜0021,結果可能是3A1B,則結果是0321或3021,只需要再猜壹次;或者2A2B,這是兩個0裏壹定有壹個是對的,2壹定是錯的,所以第三位壹定是3,結果是2031或0231,也只需要再猜壹次;或者1A3B,這時0壹定在第三位,結果是2301或3201,仍然只需要再猜壹次

綜上所述,這種策略下,最壞的情況需要9次

進壹步提高效率需要對各次的結果進行綜合,情況太多了,失去作為壹種策略的意義

這個問題,研究壹下的確蠻有意思,下面是我的想法,不壹定能解決問題,看可能可以給別人以啟發.我主要研究的是<在最壞情況下最少幾次猜中,策略如何?>

第壹步,因為各個數都是壹樣的,所以第壹次輸入0123,現在輪到出題者,我相信沒人會給他A,頂多給他B,但是給他幾個B合理呢?

0B,下次猜到B的期望E=4*4/6=8/3

1B,E=1*1/4+3*3/6=7/4

2B,E=2*2/4+2*2/6=5/3

3B,E=3*3/4+1*1/6=29/12

4B,E=4作為出題人,希望對手猜對B的期望為最小,所以,選擇給他2B.

第二步,輸入4501,再次輪到出題者,現在問題開始復雜了.

我覺得可以把4501分為兩部分,45和01,其中45是新的,按上題的方法繼續做,

0B,E=2*2/4=1;

1B,E=1*1/2+1*1/4=3/4;

2B,E=2*2/2=2;所以出題者會在45中給1B.

其實復雜的是01部分,因為他涉及到A的部分,我只能假設,出題人在不得不給A時才給A這種情況,如果算期望的話,我已經搞不清了,所以從簡了,而且這假設我覺得不壹定不合理.從給B部分,我們可以同樣按照開始的思路

0B,E=2*2/2=2

1B,E=1*1/2+1*1/2=1

2B,E=2*2/2=2

所以01中會給壹個B,現在猜題者知道的東西有0,1中有1個;2,3中有壹個;4,5中有壹個;6,7,8,9中有壹個.綜上,第2步,出題者給的是0A2B.

第三步,猜題者這壹步,稍微聰明點,從4組數中分別去4個數,最起碼可以確定,3個數字.但是我們想,作為出題人,在6,7,8,9中,如果是壹個數壹個數猜,他肯定,會將最後壹次猜的設為正確的以增加妳猜題次數,也就是說,即使妳從現在起,4步後,將6,7,8,9中正確數字的位置確定下來,也需要4步才能,將4個數字都確定.所以這種假設下,最少需要猜加上前面的兩步,***6步.如果第三步猜2046.

出題人可以不給A就不給A的前提下,理智出題者給的應該是,0A1B為什麽給1B不給0B呢,如果給0B,那麽,猜題人就知道前三組數字中1,3,5是必對了,除了在確定A是比3B有優勢,其他地方沒優勢.而給1B而不給2B的原因也就在於,確定A的時候1B比2B更有優勢(猜題者更難猜)這樣對猜題者來說,是很麻煩的,因為,他不知道1B是哪個,這次作答幾乎對確定B沒有任何貢獻,所以,猜題者不應該出這些數字.如果前三組數字只出現1個,那麽不僅可以唯壹確定這個數字所在組的B,而且對6,7,8,9中選B也有積極意義

現在總猜題情況為0123,4501所以第三步,出6078.

問題越來越復雜了,對於0可以給B也可以不給,對於6,7,8可以給B也可以不給,0B,1,9肯定是B;2B,1肯定是B,而且6,7,8之間肯定有B,但如果給1B,猜題折還需要猜測,這個B來自哪裏,增加了猜題難度,所以出題者給0A1B.

第四步,現在總猜題情況為0123,4501,6078.後面在像前面壹樣分析,我已經吃不消了,我就說我的猜題策略吧.第四步7890

如果第三步中,B是0的話,那麽,出題者該給答案1A1B

(沿著這個假設,往下,總猜題情況為0123,4501,6078,7890.現在知道的是0位置已經確定,9確定為B.第五步9240,如果9位置對了,那麽,如果給2A0B那麽結果必然是9350.如果給2A1B結果必然是9430,如果給3A0B,結果可能是9250和9340也需要兩步,最不好的情況就是要7步;如果9位置沒對,我相信,在兩步也能解出來.)只考慮這中情況,出題人就可以將妳的步數限制到最少7步

如果第三步中,B是6,7,8中的壹個,那麽,0肯定不是B了,1肯定是B,而出題者只用考慮B是在7,8中,還是6,很顯然,出題者會讓B在7,8中,所以給的答案是0A1B.總猜題情況為0123,4501,6078,7890

第五步8215,出題者0A2B

第六步5381,出題者

1A0B===>2741,

1A2B===>3751,5731

2A1B===>3481

3A0B===>4381.只有這四種情況,是由於受到前面的限制.這中結果也需要7步

我不保證自己證明的都很嚴密,但作為壹個解題者,我的感覺是,解這個題目可以步數更少些(雖然我也不知道能不能再少),如果有人能以更少的步數解出,我也會崇拜之,但如果說解這題目要比七步多,我就不同意了,我是完全站在出題者的立場,為難猜題者的思路的假設下去,這也是最糟糕的情況,這也應該是步數最多的情況.

各位有高招歡迎指正~

妳想玩可以用我的QuickBasic程序。

Randomize Timer '隨機化

Cls '清屏

Dim a(4),b(4) '定義數組

10 a = Int(Rnd * 9000)+1000 '產生壹個數

aa = a '替身變量

a$ = Mid$(Str$(a),2) '去首部空格

For i = 4 To 1 Step -1 '此循環截位

a(i) = a Mod 10

a = a \ 10

Next

For i = 1 To 3 ’此循環判斷是否有數字重復

For j = i + 1 To 4

If a(i) = a(j) Then 10 '若有數字重復,重新產生

Next j, i

For i = 10 To 1 Step -1 '有十次機會

s = 0 '"A"次數清零

v = 0 '"B"次數清零

Print i '打印還剩幾次機會

20 Input"Input a number ", b '輸入妳的數

If b = 0 Then Print "The answer is";aa: End '若直接敲回車顯示答案,同時遊戲結束

For j = 4 To 1 Step -1 '截位

b(j) = b mod 10

b = b \ 10

Next

For j = 1 To 3

For k = j + 1 To 4

If b(j) = b(k) Then 20 '若有數字重復,重新輸入

Next k, j

For j = 1 To 4

If a(j) = b(j) Then s = s + 1 '若條件滿足,"A"加1

Next

For j = 1 To 4 '找"B"的個數

b$ = Mid$(Str$(b(j)), 2) '去首位的"0"

z = Instr(a$, b$) '尋找在妳的數中和它的數相同的數字

If z <> 0 And a(z) <> b(z) Then v = v + 1 '找"B"

的個數

Next

If s = 4 Then Print "You are right!":End '如"A"=4表明全對,結束遊戲

Print s;"A";v;"B" '打印"A"以及"B"的個數

Next

Print "Sorry, you are lost!" '沒猜出來,結束

End

若沒有QB去www.iteroom.cn下載

謝謝!

  • 上一篇:信號裏的LTE是什麽意思?
  • 下一篇:surfacepro6與7的區別
  • copyright 2024編程學習大全網