“抓三堆”游戏及其终极奥秘 (全文)

“抓三堆”游戏及其终极奥秘 (全文)

                    万春熙,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施行“二进对称差运算”:

514  →  {4,1} ⊕ {8,4,2} = {8,2,1}  → 11;或直接地表达为: 514 = 11 。

用此11代替 {5,14,19} 中的19,得 {5,14,11},这是个可控局(且层级降低了)。 

  

二,实现可控操作的充分条件:

上述二进对称差运算是实现可控操作的必要条件。

要实现可控操作,运算结果必须小于所要替换的数字,即新的可控局的层级必须比原来的非可控局更低。这是充分性的条件。

例如,从上面的例子 {5,14,19} 出发,两两一组地施行二进对称差运算,可得:

514 = 11 ,1419 = 29,195 = 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} 为可控局,则2847 = 51,5128 = 47 和 4751 = 28。

由于具有这个特性,若A是可控局,则不可能找到另一个可控局B,其中会有两个数字b1,b2与A中的某两个数字a1,a2相同。因为,若A,B中有任何两组数字互等(a1=b1,a2=b2),则做为二进对称差运算的结果,第三个元素a3与b3,肯定也相等(a3=b3);所以“另一个”可控局实际上是不存在的。

换言之,若只是改变某可控局中的某一个数字(另二个数字保持不变),其结果不可能是另一个可控局,而只能成为一个非可控局。

但对于任何非可控局 {a,b,c*},按 ab = c (且c < c*)的方法将c*替换为较小的c,就能获得一个层级较低的可控局 {a,b,c}。

因此,若从某个可控局出发,必须(且只需)改变两个数字才能(且必能)到达另一个可控局。

因此,当主控方弈出一个可控局之后,按规则,对手只能使某一个数字减小,其结果只能到达某个非可控局 —— 恰好为主控方施行可控操作、继续保持可控权提供前提条件。

这就是“抓三堆”游戏的终极奥秘。

站务

全部专栏