过年回家和小朋友玩什么

Posted 陆嵩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过年回家和小朋友玩什么相关的知识,希望对你有一定的参考价值。

过年回家和小朋友玩什么

尼姆游戏的必胜策略

三堆数量随机的石头,两个人轮流从其中一堆中拿走任意数量的石头,拿走最后一块的人输,必胜法是什么?

尼姆游戏简介

初体验

三年级的时候,来探亲的姑丈和用扑克牌玩过一个游戏,大概意思的是:三五七张数的三垛牌,每人每次轮流从一垛牌里面拿不少于一张牌,谁拿到最后一张牌算输。我怎么玩怎么输,只觉得姑丈好聪明。那时候的我十分不甘心,把自己关在房顶一早上,苦心钻研,找到的必胜的策略,但是姑丈下午已经走了,从那以后我再没和别人玩过这个游戏。因为但是还小,情况也比较简单,我用的是反推的策略,也就是从最后的状态开始,反向推导必胜的一些状态,那么我只要保证每一步都是这个状态,那么最后一定能赢。

后来,上大学了,我才知道,姑丈和我玩的这个游戏叫反尼姆游戏,它是尼姆游戏的一个变种。下面简单介绍一下尼姆游戏。

玩法

尼姆游戏(英语:Nim),又译为拈,是一种两个人玩的回合制数学战略游戏。游戏者轮流从几排棋子(或者任何道具)中选择一排,再由这一排中取走一个或者多个,依规则不同,拿走最后一个的可能是输家,也有可能是赢家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆。古代就有许多尼姆游戏的变体。最早欧洲有关尼姆游戏的参考资料是在 16 世纪,目前使用的名称是由哈佛大学的 Charles L. Bouton 命名,他也在 1901 年提出了此游戏的完整理论,不过没有说明名称的由来。

尼姆游戏最常见的玩法是拿到最后一个棋子的人输(misère game,反尼姆)。尼姆游戏也可以改为拿到最后一个棋子的人赢(normal play,尼姆游戏)。大部分类似的游戏都是最后一个棋子的人赢,不过这不是尼姆游戏最常见的玩法。不论哪一种玩法,只要刚好剩下一排的棋子是二个或二个以上(其他排可能没有棋子,或是只有一个),下一个游戏者可以轻易的获胜。下一个游戏者可以将数量最多的这排棋子全部拿走或只留一个。剩下的各排都只有一个棋子。 若是 misère 版本,下一个游戏者下完之后,只要留下奇数排就会胜利,若是 normal 版本,下一个游戏者下完之后,只要留下偶数排就会胜利。

normal 版本是由二位游戏者一起玩,有三排棋子,各排的棋子为任意正整数。二位游戏者轮流选一排棋子,拿走上面至少一个棋子,也可以拿同一排的多个棋子。normal 版本的目的是要拿到最后一个棋子。misère 版本的目的就是要让对方被迫拿走最后一个棋子(拿到最后一个棋子的人输)。

必胜法

反推

三年级时候,我琢磨出来的必胜法,是针对当时比较简单的 345 (表示每堆数量为3、4、5)的情况。我拿着扑克牌通过步步反推,找了反尼姆游戏你只要制造如下的状态给对方,你就一定能赢:

3 5 6
3 4 7
2 5 7
2 4 6
1 4 5
1 2 3
1 1 1

尼姆游戏的策略就是在拿完棋子后,使棋子个数符合以下任何一个组态,接下来再轮到时,一定可以再拿走适当数量的棋子,使棋子个数仍符合以下任何一个组态。我们不妨把这些组态称为平衡态。容易证明,平衡态经过一步操作,必然到达的是非平衡态,非平衡态必能通过操作一步达到平衡态。

二进制

通过反推来计算平衡态,终究是 case by base,十分局限的。我们可以用位运算下的异或操作来理解这个事情。我们把一些正整数异或运算的结果(不知道异或的,可以查一下,这里就不介绍了),称为 “尼姆和”,那么尼姆和为零的状态,就是上面提到的平衡态。那么,有以下的结论。

1、在尼姆游戏中,第一个玩家有必胜的策略,当且仅当非平衡态。否则,第二个玩家有必胜的策略。
2、若平衡态,则无论如何取子,接下来必是非平衡态。
3、若非平衡态,必能通过一步操作,达到平衡态。

上面提到的结论证明是 trivial 的,偏数学,有兴趣的人可以查阅相关资料。通过不断地给对方制造平衡态,我们必然可以给自己留下 “只剩一排的棋子超过一个(二个或二个以上)” 的状态。为什么呢?这个留作课后思考题,拍拍你的小脑袋想一想吧。简单地说呢,在游戏过程中,必然其中的某一人会经过这样一个状态。因为这个状态不是平衡态,那么在必胜策略下,必然是我自己要面临这样一个状态。

有了以上理论的支持,我们就可以得到必胜的方法,即:每次都给对方制造平衡态,直到只剩一排的棋子超过一个(二个或二个以上)。下面的操作,就不言而喻了。

如何保持平衡态

我们已经搞清楚了一个问题,就是不断地给对方平衡态,就一定能获胜。那么,面对一个非平衡态,怎么取子才能保证平衡态呢。我们可以采用如下的策略:

  1. d d d 是总尼姆和(不妨记作 s s s)二进制表示法中最左边1的位置,选择一个这个位置也是 1 的堆(不妨记作 x x x)(一定能找到,想想为什么)。
  2. 从选择出来的堆中取出 n n n 子, n n n 表示 [ x x x- s s s x x x 的尼姆和](一定能办到,想一想为什么)。

这么操作,容易想到 n ≤ x n \\leq x nx,必然是够取的。另外,取完之后,必然达到了一个平衡态,为什么呢?自行想想。提示如下:
t = s ⊕ x k ⊕ y k t=s \\oplus x_k \\oplus y_k t=sxkyk
其中 s s s 表示初始不平衡态的尼姆和, t t t 表示操作后的尼姆和。 ⊕ \\oplus 表示尼姆和。 x k x_k xk y k y_k yk 分别表示对某一堆操作前后的状态值。

二者区别

normal 版本和 misere 版本的差别只在最后一两步,前面都相同:若是玩 misère 版本。前面的策略都一样,只到只剩一排的棋子超过一个(二个或二个以上)时才有不同。此时的策略都是针对超过一个棋子的那排棋子取子,使留下来的每一排都只有一个棋子。接下来玩的人只能从这几排中选一排拿走。取子可能是那排全部取完,或是只剩一个,视游戏版本而定,在玩 misère 版本(拿到最后一个棋子的输)时,要使留下来的排数是单数(因此对方会拿到最后一个棋子),在玩 normal 版本游戏时,要使留下来的排数是偶数。(因此自己会拿到最后一个棋子)。

必胜法记忆

现在回到主题,过年回家和小朋友玩什么。按照上面二进制异或方法,真的玩起来的话,每次操作,岂不是要想或者计算老半天。那这样就没什么意思了,会被小朋友鄙视的。我们必须想一些可操作性的法子。

反推法平衡态记忆

我们可以记忆固定类型下的一些平衡态。

2 堆3 堆4 堆
2 21 2 31 1 n n
3 31 4 51 2 4 7
4 41 6 71 2 5 6
5 51 8 91 3 4 6
6 62 4 61 3 5 7
7 72 5 72 3 4 5
8 83 4 72 3 6 7
9 93 5 62 3 8 9
n n4 8 124 5 6 7
4 9 134 5 8 9
5 8 13n n m m
5 9 12n n n n

譬如说,对于年纪小一点的小朋友,我们可以和他们玩 345 的反尼姆游戏,这时候平衡态就是 123 和 145。对于年纪大一些的,可以玩 357 的反尼姆游戏,这时候的平衡态有:123、145、246、257、347、356。心里默默记下这些数,自然就妥了。

二进制心算的作法

另一个方法,比较容易心算的作法,但是需要有一定的心算能力。将三堆的个数分别表示为相异二次幂的和,设法消除成对的次幂,再将最后留下的数字想想怎么从一堆拿掉一部分,让剩下的能全消除即可。举个例子,对于 345 的情况,

3 = 0 + 2 + 1 =     2   1      
4 = 4 + 0 + 0 = 4              
5 = 4 + 0 + 1 = 4       1      
--------------------------------------------------------------------
1和4都消去了, 剩下的是2,直接在第一堆拿掉一个2,便全零了,全零相加便是平衡态。

因此下一步是在第一堆拿走二个棋子,使其数量变 1。再举个例子,对于 4、9、14 的例子。

4 = 0 + 4 + 0 + 0 = 0  4  0   0      
9 = 8 + 0 + 0 + 1 = 8  0  0   1            
14= 8 + 4 + 2 + 0 = 8  4  2   0      
--------------------------------------------------------------------
8和4都消去了, 剩下的是第三堆的2和第二堆的1,直接在第三堆拿掉1,剩下的第二堆的1和第三堆的1,尼姆和为0,便是平衡态了。

对于4、9、14,消去 8( 2 的三次幂),成了4、1、6,再消去 4,成了 0、1、2,此时不可再消了,只在第三堆拿掉 1,配平乘 0、1、1,尼姆和便是 0 了。怎么样,是不是还是很好心算的。

尼姆类似游戏

减法游戏

那天和同学去吃饭,聊起了两个人走台阶,每个人只能在前面人的基础上选择走固定的集合(比如说1 2 3 4) 里面的步数,谁抢到最后一个台阶算胜利。请问必胜策略是什么。这个游戏称为减法游戏,它会先给出一个总数,以及每一次可以拿走的最大数量。可能每一次只能拿走1个、2个 … 至 k 个。对于减法游戏,我们给出如下理论。

若棋子只有一排,共有 n 个棋子,其必胜策略当且仅当:

  • n ≡ 0 (mod k + 1)(后拿的人赢)
  • n ≡ 1 (mod k + 1)(后拿的人输)

比如说 n=21、k=3 的时候,我们习惯叫 21 游戏。21 游戏一般会用拿到最后一个棋子的人输的玩法。可以有数个游戏者参与。第一个游戏者说 1,其他的游戏者可以在前一个人的数字加 1,2 或是 3。数到 21 的游戏者输。若是二个游戏者玩,有必胜的策略,就是让加完的数字维持是 4 的倍数。这可以使另一方最后一定会数到 21。21 游戏的数字也可以修改,例如改为“最多加 5,数到 31 的人输”。

多排尼姆游戏

另一个版本的尼姆游戏,是允许在每一堆中取走相同数量的棋子。

循环尼姆

另一种尼姆游戏的变体是循环尼姆,将一定数量的棋子摆成圆形,二个游戏者轮流取棋子,可以取相邻的一个、二个或三个棋子。直到谁取走最后一个算输或者赢。

Grundy 游戏

Grundy 游戏也是尼姆游戏的变体,一开始有一堆特定数量的棋子,游戏者要轮流将某一堆棋子分为二排数量不同,且都不为 0 的棋子。例如 6 个棋子可以分为 5+1、4+2,但不能分为3+3。此游戏可以让最后一个人赢或是输。

以上是关于过年回家和小朋友玩什么的主要内容,如果未能解决你的问题,请参考以下文章

我全中!回家过年8大焦虑,你占几个?

文末抽现金敖丙回家过年,外婆说没带女朋友别回来了?喝了老爸89年的酒,当场反目。

过年抢票回家居然掉入诈骗陷阱

程序员过年回家前的最后几晚都在想什么?

二分查找法:在女朋友回家之前可以玩多少个游戏?

编程马拉松016-过年回家