雙人取牌問題研究(誰取最後一張誰贏)
一、名稱定義
①堆張:多少堆,每堆多少張
②堆張的數學表示法(牌不分左右順序,該表示法按左小又大排序只是為了便於討論):
(2,3)表示兩堆牌,一堆2張,一堆3張。
(1,2,3)表示三堆牌,一堆1張,一堆2張,一堆3張
③先手必勝堆張:如(1,2,4),先取成(1,2,3)
先手必敗堆張:如(2,2),(1,2,3)
先手不能決堆張:先手不能決定勝負的堆張
④堆張總集合:(x1,x2,x3...) 表示任意堆,任意張
兩堆牌總集合:(x,y) 表示兩堆,任意張。(2,2)屬於這個集合,(36,89)也屬於這個集合
三堆牌總集合:(x,y,z)
二、研究問題
①是否存在先手不能決堆張?
答案:不存在
反正法:假設存在乙個(x1,x2,x3...)的先手不能決勝負堆張,當我取完若干張後,這時堆張為以下三種情況;
1 先手必勝堆張 2 先手必敗堆張 3 先手不能決堆張
如果為1,則原堆張為先手必敗堆張;如果為2,則原堆張為先手必勝堆張;如果為3,這時情況略微複雜一些,假設
先手不能決堆張取完一次後仍為先手不能決堆張,可以再取一次,先手不能決堆張→先手不能決堆張→...→先手不能決堆張
這個過程不是無限的,因為牌的總數不為無限,最後一張牌總會被取完,所以證明不存在先手不能決堆張。
由此推出:堆張總集合 = 先手必勝堆張集合 + 先手必敗堆張集合
②給出堆數,求解先手必敗堆張集合(先手必勝集合為必敗堆張中某堆加n張即可)?
一堆牌,先手必敗堆張集合:無
兩堆牌,先手必敗堆張集合:(x,x)
三堆牌,先手必敗堆張集合:
(1,2,3)(1,4,5) (1,6,7) (1,8,9)。。。
(2,4,6)(2,5,7)(2,6,8)(2,7,9)(2,8,10)(2,9,11)(2,10,12)。。。
(3,4,7)(3,5,6) (3,7,8) (3,9,10)。。。
(4,5,9)(4,6,10)(4,7,11)(4,8,12)。。。
。。。公式我還沒推導出來,但也發現必敗堆張有以下規律:
1 很容易發現除了第3排以外,基本都是x1+x2=x3
2 3堆牌數總和都為偶數
3 某一必敗堆張在兩堆牌中分別加一張構成了新的必敗堆張,如(2,4,6)→(3,4,7)
結論:不妨設x1<=x2<=x3
若x1+x2=x3 若(x2+x3-5)%4=0 減5除以4,是否能除盡。若能,先手必敗,若不能,先手必勝。
若x1+x2 !=x3 則x1+x2+x3=偶數,先手必敗;則x1+x2+x3=奇數,先手必勝
也就是說,開始了的數字就注定了最後的輸贏結果。
1)兩堆的情況,若等則 先手必敗,不等的情況,先手必勝,因為轉化成等的情況
2)三堆的情況,看x2 和x3 若相等,直接拿掉x1堆,好辦。若x2和x3不等,怎麼辦呢,x1 又存在。我們知道(1,1,1)先手必勝
3)(1,2,3)先手必輸的原因就是無論怎麼拿,拿掉1堆也好,只剩兩堆,而且不等,再拿乙個(或者幾個),使相等,那麼先手就輸了
若2 拿1個,或3拿1個,又可以轉化成相等,必輸
1)兩堆的情況,若等則必敗
2)三堆的情況 (1,2,3)先手必輸的原因就是無論怎麼拿,拿掉1堆也好,只剩兩堆,而且不等,再拿乙個(或者幾個),使相等,那麼先手就輸了
若2 拿1個,或3拿1個,又可以轉化成相等,必輸
(1,2,3)→(1,2,1) 或(1,2,2)或(1,1,3) 都有相等的情況出現,故也必輸
(0,1,2)或,0,1,3 )或,0,2,3)都不等,必輸
說白了,終極判斷條件就是。如果x1 x2 x3 有相等的情況 則其必輸
初始化的時候,先判斷三個,若有兩個相等,則先手必輸
最終條件就是:判斷(0,0,0)為誰拿之後的狀態,誰就贏
你拿多少個,我就拿多少個,這是每個人的判斷標準(只有這一堆裡不出現0,1,2,3)或者同時出現 2,3才來判斷即可
先手必輸的例子
1,5,6 先手勝,1,6,7 先手敗。。故先手必勝 1 101 200 →1,100,101 →1,6,100→1,6,7→1,5,7→1,4,5→
→1,7,100 →1,6,7
→1,8,100 → 1,8,9
→1,21,100 →1,20,21
3,50 ,100 先手勝 3,50 ,100 →3,50,53 →3,20,50 →3,20,23 →3,6,23 →3,6,9,→3,6,7 →3,4,7→(3,1)(3,2)都輸
2,5,6 先手必勝嗎? 2,5,6 →2,4,5 1 個,兩個,三個,四個都不好 故必勝
除了這些搭配,其餘都是先手必勝。因為它可以轉化這種例子
(1,1,2)(1,2,2)(1,2,3)(1,4,5) (1,6,7) (1,8,9)。。。
(2,4,6)(2,5,7)(2,6,8)(2,7,9)(2,8,10)(2,9,11)(2,10,12)。。。
(3,4,7)(3,5,6)(3,6,9) (3,7,8) (3,9,10)。。。
(4,6,10)(4,7,11)(4,8,12)。。。
最後結論:
初始化的時候,①先判斷三個,若有兩個相等,則先手必勝。因為可以直接拿掉另外一堆牌。
②若沒有相等的時候,不妨設x1ii)若x1+x2=x3 若x1為偶數且x2=x1+1 ,則先手必勝 若x2為偶數 則先手必敗。
ii)若x1+x2=x3 ①若x1為奇數1時,x2是偶數時,則先手必敗
iii)若x1+x2=x3 ②若x1為其他奇數時,則先手必敗
雙人遊戲問題
有如下乙個雙人遊戲 n個正整數的序列放在乙個遊戲平台上,兩個人輪流從序列的兩端取數,取數後該數字被去掉並累加到本玩家的得分中,當數取盡時,遊戲結束,以最終的分多者為勝利。編寫乙個執行最優策略的程式,最優策略就是使得自己能在當前情況下得到最優策略。要求程式要始終為第二位玩家執行最優策略。該題目的動態規...
C語言取牌遊戲
有54張撲克牌,兩個人輪流拿牌,每人每次最少取1張,最多取4張,誰拿最後一張誰輸。編寫模擬計算機先拿牌且必勝的演算法。分析 為了保證計算機勝利,因此最後的牌必須是人取到,而且只能剩餘1張。通過觀察發現,除去最後一張牌,還剩餘53張牌。除去第一次計算機取牌,之後的每次計算機如果要贏得遊戲,可以根據人取...
取石子兒和拿撲克牌問題
tang 和jiang 非常喜歡玩一種有趣的小遊戲 有 n個石子,兩人輪流從中取出1個 3個或 4個石子,當石子被取空時,遊戲結束。最後乙個取石子的人獲勝 第一次總是 tang取.當然,他們倆都足夠聰明,總會採取最優的策略。演算法思想 使用遞迴 當剩餘為1 3 4的時候先手者必勝 如果當前數目不是這...