這個益智遊戲有趣易行,是給眾多普通人家孩子的春節禮物_風聞
guan_15859850211090-2022-01-29 19:23
“抓三堆”遊戲及其終極奧秘 (全文)
萬春熙,2022年 1月
前言
“抓三堆”遊戲有趣且簡便易行、隨時隨地都可玩起來,可以自娛自樂(左右手對弈),能增益智力。遊戲者若掌握其原理,將有助於發展十進/二進制轉換與集合運算能力。
我在1969年接觸到這個遊戲。那時,北理工的教師和學生一起到首鋼參加勞動。休閒的時候,一位同學用這遊戲發起“挑戰”;在上、下工的隊伍裏,我們曾經用輪流口述三個數字的方式,一邊走路一邊玩遊戲。後來,我悄悄地破解了這個遊戲的奧秘。
五十多年過去了,卻發現網上居然湧現出很多討論這個遊戲的貼文,但無一能明確徹底地揭示該遊戲的奧秘;反而,混亂和錯誤比比皆是。所以,深感有必要把這個遊戲的終極奧秘公佈出來,併力求解説得明白透徹,供有興趣的朋友們實踐運用或研究參考。
本文有兩部分:第一部分是入門,介紹該遊戲的操作方法、規則和初步技巧。第二部分揭示該遊戲的終極奧秘。
建議先讀第一部分,並親自試做幾次遊戲(左右手互弈也很好),積累經驗、試探規律。然後再讀第二部分(涉及一點點計算機專業的入門數學知識,絕對不難),才能徹底理解並掌握百戰百勝的法則。
春節即將到來,又是疫情期間,希望這遊戲以及本文能給人們增添快樂。
第一部分 “抓三堆”遊戲入門
一、遊戲方法與規則:
設置三堆棋子(或石子、紙團、硬幣等顆粒物),每堆數量不限。熟練後也可用口述或書寫三個數字等方式來代替棋子。
規則:甲乙兩方對弈,輪流從任選的一堆(限制只選一堆)中取出至少一枚(甚至全部)棋子。反覆進行,直到最後一堆的最後一枚(甚至全部)棋子被一方取走,清零,則最後這位操作者獲勝。
定義:若a,b,c是各堆棋子的數目,則集合 {a,b,c} 是遊戲的局勢,簡稱“局”。集合中各元素可任意排序,即 {a,b,c}={b,c,a}={c,b,a}。
定義:局中棋子的總數為該局的“層級”。遊戲中的每一步操作必定使局的層級降低,直至清零(層級為零,無可再低)。
在所有可能的局勢中,“可控局”是致勝關鍵(其嚴格定義留待第二部分),下面的例子將展示遊戲過程中,主控方如何通過一系列“可控局”,一步步取得勝利。
例1,設置三堆棋子,隨機地假定局勢為{5,7,9}(非可控局)。
第一輪:甲將5減至2,得到 {2,7,9};
乙將9減至5,得到 {2,7,5} —— 這是可控局,於是,乙成為主控方。
第二輪:甲將7減至3,得到 {2,3,5};
乙將5減至1,得到 (2,3,1) —— 這仍是可控局。
第三輪:甲將3減至0,得到 {2,0,1};
乙將2減至1,得到 {1,0,1} —— 這仍是可控局。
第四輪:甲將某個1減至0,得到 {0,0,1}(無選擇餘地);
乙將最後的1清零,得到 {0,0,0},乙勝。
二、制勝的初步秘訣和策略(較簡單的“可控局”等):
1、最簡制勝招數是造成“兩堆一樣”,這是一批“可控局”。—— 在例1第三輪,乙方弈出 {0,1,1};即鎖定了勝局。隨後,無論甲方如何操作,乙方總能清零並獲勝。故對於甲方而言 {0,1,1} 是必敗局,對於乙方則是必勝局;這就是一個可控局,乙方是主控者。
注意,{0,2,2}、{0,3,3}、…{0,m,m}、…都可經過若干輪的操作而抵達{0,1,1},故 {0,m,m} 是一批可控局,其中m是任何正整數。
(注:若對方已陷入 {0,m,m} 局中;若他從某個m中減去p枚棋子,主控方只需在另個m中也減去p枚棋子,局勢 {0.m-p,m-p} 仍是“兩堆一樣”,直到 {0,1,1}、{0,0,0} 為止。)
2、{1,2,3} 是第二個最簡單的可控局。—— 在上例第二輪第二步,乙方弈出的 {1,2,3} 也是可控局。甲方此時有6種操作方案,但是隨後乙方必能弈出 {0,m,m},最終獲勝。
3、“可控局”、“可控操作”和“可控網”:—— 存在無限多的可控局,但卻有更多的“非可控局”。下面列出一批層級較低的可控局,將它們按層級列陣如下(只需掌握其中5-6個以上的、其層級最接近 {0,0,0} 的可控局,就能在遊戲中擁有很大的主控權):
:::::::
{5,8,13} , {5,9,12} , {5,10,15} , {5,11,14} , {5,16,21} , {5,17,20}, … … ;
{4,8,12} , {4,9,13} , {4,10,14} , {4,11,15} , {4,16,20} , (4,17,21), … … ;
{3,4,7} , {3,5,6} , {3,8,11} , {3,9,10} , {3,12,15}, … … ;
{2,4,6} , {2,5,7} , {2,8,10} , {2,9,11} , {2,12,14}, … … ;
{1,2,3} , {1,4,5} , {1,6,7} , {1,8,9} , … … ;
{0,1,1} , {0,2,2} , … … … , {0,m,m} , … … ;
{0,0,0} 。
從任何一個層級高於 {0,0,0} 的可控局出發,若只通過一步操作,絕不可能抵達另一個可控局;只能抵達某個“非可控局”(必定是層級較低的)。
但從任何“非可控局”出發,施行某種“可控操作”(後面將詳細解説,也可按上面舉出的可控局陣列操作),定能抵達某個層級較低的“可控局”。
如此逐輪操作下來,可構成朝向 {0,0,0} 匯聚的網,即“可控網”。
策略:主控方必須搶先弈出可控局,隨後每輪持續弈出可控局,使對方無法擺脱可控網、逐步逼近 {0,0,0};最後以可控的方式“清零”。
三、變換“獲勝準則”將會怎樣?可以“讓對手獲勝”嗎?
1、變換“獲勝準則”之後,如何獲勝?
若約定“清零者失敗”(事實上,的確有不少人偏愛這個準則),前述的獲勝策略總體上仍然有效 —— 主控方仍需一路控制局勢,直到清零之前的最後一輪,才必須做出調整。
回憶例1,原來有:“ … …
第三輪操作:甲將3減至0,得到 {2,0,1};
乙將2減至1,得到 {1,0,1} —— 這是可控局。
第四輪操作:甲將某個1減至0,得到 {0,0,1};
乙將最後的1清零,得到 {0,0,0},乙勝。 ”
現在,因為獲勝準則已改變為“清零者失敗”,乙方必須在第三輪第二步及時調整策略:避開可控局 {0,1,1}, 卻要搶先弈出 {0,0,1} (“非可控局”)。隨後,甲方只能清零;按新規則甲敗,乙方獲勝!
詳細地説,調整後的策略應是:
(1)目標:搶先弈出 {0,0,1} 。為此,主控方需從較高層級的可控局出發,一路控制下來,直到弈出 {0,2,2} 或 {1,2,3} 為止。
注意:絕不可弈出{0,1,1},它緊鄰 {0,0,1},對方將一步獲勝。
(2){0,2,2} 是第一個可控臨界點。此後,對方有2種可能方案,即 {0,0,2} 或 {0,1,2},隨後,主控方必能弈出 {0,0,1}。
(3){1,2,3} 是第二個可控臨界點。此後,對方有6種可能的操作方式;待其操作後,主控方將有:
(i)2個機會:若對方弈出{0,1,2} 或 {0,1,3},主控方應及時弈出 {0,0,1};
(ii)2個機會:若對方弈出{1,1,2} 或 {1,1,3},主控方應弈出 {1,1,1},以迫使對方弈出 {0,1,1},然後主控方就能夠弈出 {0,0,1};
(iii)2個機會:若對方弈出 {0,2,3} 或 {1,2,2},主控方應弈出 {0,2,2},然後按(2)執行。
(注1:無需硬記上述細節,只需理解並掌握原則、臨機應變。)
(注2:一般地,從某個層級較高的可控局出發,總能通過若干輪操作後抵達 {0,2,2} 或 {1,2,3},隨後即可按(2)或(3)執行。但或許會出現對方急於求敗的情況:即對方可能從某個可控局出發,弈出一個非可控局 {0,1,m},m > 1;這時,主控方就能直接弈出 {0,0,1},更快地鎖定勝局。)
2、如何能夠(並且,為何有需要)“使對方被動地獲勝”?
假若,獲勝準則恢復為:“清零者獲勝”,那麼,運用上述調整後的策略,主控方在最後一步弈出了{0,0,1},那麼,對方隨即就能清零。於是,在主控方控制之下,對方將“被動地獲勝”。
又假若,獲勝準則已變為“清零者失敗”;那麼,只要繼續採用前面第二節的全套策略、不做任何調整,主動地一路弈出可控局,直到最後主動清零、“主動失敗”,遂使得對方“被動地獲勝”。
如果遊戲的對方是晚輩小朋友,他們大多會覺得有輸有贏的遊戲才有趣。如果能不動聲色地讓他們多贏幾盤,取得皆大歡喜的效果,應該也是樂事!—— 如果能夠給需要關愛的人們帶來更多的快樂,那將是更高層級的快樂。
第二部分 “抓三堆”的終極奧秘
一、施行“可控操作”的兩個方法:
可控操作就是從任何非可控局出發,只經過一步操作,就到達某個層級較低的可控局的操作。下面是兩個施行方法(第一個必須知道,但第二個更好):
1、布爾代數的“異或”運算法(似更適合機器計算):
舉例説明:設非可控局為 {5,9,14},要對其施行可控操作:
第一步,將前兩個數字5和9轉換為二進制表達*:
5 = 0+4+0+1 → [0101];(注:右側是二進制表達。)
9 = 8+0+0+1 → [1001]。
(*註釋: 二進制表達之前,要把十進制的數字轉換為二進制諸位權之和,如63=32+16+8+4+2+1, 53=32+16+0+4+0+1, 等等。
相應的二進制數就是:63→[111111], 53→[110101], 等等。)
第二步,對這兩個二進制數施行“異或(Exclusive OR)”運算,即逐位相加,但須令1+1=0(可理解為‘同性相斥’或“一山不容二虎”)。遂有:
[0101] ⊕ [1001] = [1100]; 其中,⊕ — 異或運算符。
第三步,再將此二進制數轉換為十進制數,即
[1100] → (8+4+0+0)= 12。
第四步,將所得數字12替換原來 {5,9,14} 中最後的數字14,得到的 {5,9,12} 就是一個層級較低的可控局。
以上四步完成了一個可控操作。
2、集合對稱差運算法(更簡捷、適合心算):
繼續引用前例。
第一步,將5和9按二進制位權展開,並映射為集合,如下:
5 = (0+4+0+1) → {0,4,0,1} (熟練後可表為 {4,1});
9 = (8+0+0+1) → {8,0,0,1} (或 {8,1},將0視為“虛無”)。
第二步,對此二集合施行“對稱差運算”,就是把兩個集合併合,但將“非零相同元素”排除。設定“⊕”是對稱差運算符(與“異或”運算符相通)。例如:
{0,4,0,1} ⊕ {8,0,0,1} = {8,4,0,0}; 或簡寫為: {4,1} ⊕ {8,1} = {8,4}。
本例中,“非零相同元素”是兩個‘1’;“將其排除”就是消減至“零”,即視為“虛無”。
第三步,將運算結果,反向映射為數字,即:
{8,4,0,0} → 8+4+0+0 = 12; 或簡寫為: {8,4} → 8+4 = 12 。
第四步,仍如 (1)那樣,將所得的12替換原來的數字14,得到 {5,9,12}。
這個方法免去了十進/二進制來回轉換的步驟,更為簡捷。
其實,布爾代數中的“異或”運算乃是集合論中“對稱差”運算的一個特例。上面兩種方法的核心都是:按2的冪次展開之後,視為集合,再進行對稱差運算。
可以設定一個新的運算符“**Ⓧ****”**來統括表達上述過程,並簡稱之為“二進對稱差運算”。例如: 5 **Ⓧ**9 = 12。這樣的一個算符就代表了上面從第一步到第三部的全過程。
為熟悉這種表達方式,再舉一例:如 {5,14,19} 為非可控局,從它出發,要施行可控操作,首先要對5和14施行“二進對稱差運算”:
5**Ⓧ14 → {4,1} ⊕ {8,4,2} = {8,2,1} → 11;或直接地表達為: 5Ⓧ**14 = 11 。
用此11代替 {5,14,19} 中的19,得 {5,14,11},這是個可控局(且層級降低了)。
二,實現可控操作的充分條件:
上述二進對稱差運算是實現可控操作的必要條件。
要實現可控操作,運算結果必須小於所要替換的數字,即新的可控局的層級必須比原來的非可控局更低。這是充分性的條件。
例如,從上面的例子 {5,14,19} 出發,兩兩一組地施行二進對稱差運算,可得:
5**Ⓧ14 = 11 ,14Ⓧ19 = 29,19Ⓧ**5 = 22;
但是,29 > 5,22 > 14;無論 {29,14,19} 或 {5,22,19} 都比 {5,14,19} 的層級更高。所以,只有第一組運算的結果滿足充分條件(11 < 19),可以實現可控操作;其他兩組運算都無效。
滿足充分條件的可控操作是肯定存在的,證明從略,三組運算中至少有一組結果會滿足充分條件。頂多試算三次或兩次,就能找到這個結果。
(注:在遊戲進程中,主控方若已弈出可控局{a,b,c},對方又從此出發,弈出了一個非可控局 {a,b,c*};隨後,從 {a,b,c*} 出發,主控方無需再試算aⓍb,因其結果肯定又回到上一輪的 {a,b,c}。這時,頂多再試算兩次就能找到滿足充分條件的運算結果。)
下面的方法可能有助於快速找到這組滿足充分條件所需要的結果。
仍以 {5,14,19} 為例,對三個元素實行二進展開,如下:
5 = 4 + 1 → { 0, 0, 4, 0, 1} → [00101]
14= 8+4+2 → { 0, 8, 4, 2, 0} → [01110]
19=16+2+1 → {16, 0,0,2,1} → [10011]。
可以看出,第三行(‘19’數據行)中有個16,是位權數值最大的(16>15=8+4+2+1),而且在三組數據裏是唯一的。若保留19並且將其與14或5實行二進對稱差運算的話,16將被保留下來(一權獨大),運算結果肯定大於14和5;不能滿足充分條件。因此,可控操作所需的數值減縮對象只能是19。
這個方法只需審視三組中最大的位權數值,有時可以快速找到運算目標,適合於心算。
三,可控局的固有性質,以及“抓三堆”遊戲的終極奧秘:
上面兩節的三個方法是相通的,其核心都是對稱差(或‘異或’)運算⊕。對稱差運算,具有一個奇妙的固有性質:
設 {a,b,c} 為集合,若且僅需若a⊕b = c,則必有 c⊕a = b,且 b⊕c = a。
也就是説,滿足對稱差運算關係的三個元素,是一個彼此互為因果的“小圈子”。
可控操作的“二進對稱差運算”是對稱差運算的外延,延續了對稱差運算的這個性質。例如,若 {28,47,51} 為可控局,則28**Ⓧ47 = 51,51Ⓧ28 = 47 和 47Ⓧ**51 = 28。
由於具有這個特性,若A是可控局,則不可能找到另一個可控局B,其中會有兩個數字b1,b2與A中的某兩個數字a1,a2相同。因為,若A,B中有任何兩組數字互等(a1=b1,a2=b2),則做為二進對稱差運算的結果,第三個元素a3與b3,肯定也相等(a3=b3);所以“另一個”可控局實際上是不存在的。
換言之,若只是改變某可控局中的某一個數字(另二個數字保持不變),其結果不可能是另一個可控局,而只能成為一個非可控局。
但對於任何非可控局 {a,b,c*},按 a**Ⓧ**b = c (且c < c*)的方法將c*替換為較小的c,就能獲得一個層級較低的可控局 {a,b,c}。
因此,若從某個可控局出發,必須(且只需)改變兩個數字才能(且必能)到達另一個可控局。
因此,當主控方弈出一個可控局之後,按規則,對手只能使某一個數字減小,其結果只能到達某個非可控局 —— 恰好為主控方施行可控操作、繼續保持可控權提供前提條件。
這就是“抓三堆”遊戲的終極奧秘。