正文

拿石子游戏(NIM)

(2007-04-21 09:24:28) 下一个
拿石子游戏(NIM)

NIM是一种两人玩的游戏,规则是这样的:有三堆石子,每堆分别有三,五,七个。两人轮流拿,每次拿的个数不限,但只能从一堆拿。拿最后一个的胜。围绕着NIM棋有一整套理论。我们从简单讲起。

问题1。有一堆50个石子。每人每次可以拿1到10个,拿最后一个的胜。第一次拿几个可以保证必胜?

这道题比较简单。只要给对方11的倍数就行了。因为 50 = 6 mod 11,第一次应该拿6个。但是从这里我们可以展开NIM理论。

这种游戏有下列特征:
1。游戏由一系列(有限个)不可逆状态组成。
2。允许走法由状态决定。
3。到不能继续时游戏结束,走最后一步的人胜。

如果对一个状态必胜策略存在,称之为胜状态,否则为负状态。从胜状态出发,一步一定可以到达一个负状态,而从负状态出发,一步到达不了另一个负状态,只能到达胜状态。对每一种状态P定义P的NIM值N(P)如下:

1。不能继续的状态的NIM值为0。
2。对状态P,设S为所有从P可以一步到达的状态的NIM值的集合。则N(P)等于不在S中的非负整数中最小的。

比如说,如果从P出发可以一步到达的状态的NIM值为0,1,2,5,7,N(P)就为3。容易看出下列定理:

定理1。状态P是胜状态的充分必要条件是N(P) > 0。必胜策略是达到NIM值为0的状态,即负状态。

我们看看怎样用定理1来解问题1。根据定义可以算出来正整数n的NIM值等于N(n) = n mod 11。必胜策略是拿走n除以11的余数。

再看一个例子:

问题2。有充分多的一分,五分,十分,二十五分,五十分,一百分硬币。二人轮流向一个瓶内投硬币,每次一枚,先投到20.05元为胜,超过为负。第一次应该投哪一个硬币?

这个问题相当于有一堆2005个石子,每次可拿一,五,十,二十五,五十,一百个。计算可得前15个NIM值为:1,0,1,0,1,0,1,0,1,2,3,2,3,2,0。15以后为周期性。因为2005 = 10 mod 15,其NIM值为2。必胜策略为投十分,二十五分,或一百分。

有时问题不用理论也能解,例如

问题3。有一块6X8的矩形巧克力,左下角那一块坏了。两人分吃,每次掰掉一条,即剩下的还是矩形。吃最后一块为负。第一次应该掰多少?

当然是给对方留下正方形,即第一次掰2X6。如果用NIM值来算。下面是每个矩形的NIM值:

5,4,7,6,1,0,3,2
4,5,6,7,0,1,2,3
3,2,1,0,7,6,5,4
2,3,0,1,6,7,4,5
1,0,3,2,5,4,7,6
0,1,2,3,4,5,6,7

还有时即使用了理论也不好解,例如

问题4。(和上一题差不多。)有一块6X8的矩形巧克力,左下角那一块坏了。两人分吃,每次掰时,先选定一块,然后把这块及其上面和右面的都掰掉。(剩下的是锯齿形。)吃最后一块为负。第一次应该掰多少?

这一题的NIM值就很难算了,要编一个程序才行。下面是矩形的NIM值。(还不包括锯齿形。)

5,8,12,16,21,13,28,32
4,7,11,13, 6,21,23,22
3,5, 9, 6,13,16,19,12
2,4, 5, 9,11,12,13,16
1,2, 4, 5, 7, 8,10,11
0,1, 2, 3, 4, 5, 6, 7

从这里可以看出问题4的必胜策略存在,但看不出是什么。再继续计算锯齿形的NIM值才能知道唯一必胜策略是掰掉4X5的一块。

有意思的是在这个问题中大于1X1的矩形的NIM值都不是0。这是可以证明的:设P为一个矩形状态,P’是P掰掉右上角的一小块后剩下的锯齿形状态。注意所有从P’能一步达到的状态,都能从P一步达到。因此不论N(P’)是否为0,N(P)都不为0。这样我们就得到了一个非构造性的证明:任何大于1X1的矩形状态都是胜状态。

下面一道题也是非构造性的。

问题5。一张纸上写着从1到N的自然数。两人轮流从纸上擦去一个数。这个数的所有因子自动消失。比如:划掉数8, 则纸上 8 4 2 1自动消失。划掉最后一个数的人获胜。问:当N=3000 的时候,最后谁赢?

第一个人一定能赢。假设他不能赢,则不管他划几,第二个人都能赢。第一个人就划1,设第二个人划k能赢。但第一个人可以直接划k,就赢了。

我们注意到,在上面的理论中,NIM值只是0才有用。只要算到1就行了,大于1的可以都算成1。还有另一个问题就是NIM值太难算。下面我们对一大类游戏来简化NIM值的计算,算法中就要用到大于1的NIM值了。

这类游戏可以分解为几个独立子游戏,每个子游戏满足前面的条件,子游戏的规则可以相同也可以不同,每人每次只能在其中一个子游戏中走一步。这类游戏的状态也是由子状态组成的。

定理2。整个状态的NIM值等于对所有子状态的NIM值进行二进制的不进位加法,即逻辑中的XOR运算。

例如,如果三个子状态的NIM值分别为3,5,7,则整个游戏的NIM值为 (11) XOR (101) XOR (111) = 1。我们用圆括号(x)来表示正整数x的二进制形式,如7 = (111)。

定理2的证明不难,只是用到NIM值的定义和二进位数基本运算。但是却十分有用。下面看一看怎样用它计算NIM值及必胜策略。

在NIM游戏里,初始状态「3,5,7」的必胜策略是什么?状态「3,5,8」的必胜策略又是什么?状态「3,4,5,6,7」呢?

前面已经算过这个初始状态的NIM值N「3,5,7」为1,必胜策略就是从任何一堆拿一个就行了。

一般来说,先把NIM值表成二进位数,找一个在NIM值的最高位为1的子状态,然后比较整个状态和子状态的NIM值。所有整个状态为1的位上,子状态是1就改成0,是0就改成1。

例如「3,5,8」的NIM值为14 = (1110),最高位是第四位。8 = (1000)的第四位为一,所以这个子状态的NIM值应变为(0110) = 6。必胜策略就是在8的一堆上拿两个。

「3,4,5,6,7」的NIM值是3 = (11)。要找一个第二位为1的子状态,3,6,7都可以。大家可以自己算一下应该拿几个。(答案:3,7拿3个,6拿1个)

NIM还有一个变种:走最后一步为负。这种情况下,一开始还是和普通NIM一样,但到了只有一个子状态的NIM值大于1时就不同了。如果有奇数个子状态为1,就把大的一堆拿光,如果有奇数个,就剩一个。也就是说,给对手剩下奇数个1。

下面再看几种NIM类型的游戏。

问题6。现代保龄球是由古希腊一种叫KAYLES的游戏发展而来。KAYLES的规则如下:11个瓶排成一排,两人交替击瓶,可以击倒任意一瓶,也可以击倒相邻两瓶(不准故意击不中)。击倒最后一瓶为胜。现在对手击倒2号瓶,问怎样才能获胜?

这个游戏的特点是可以产生出新的子状态。一开始是状态「11」,现在变成了「1,9」。但所有的原理仍然有效。可以算出前9个数的NIM值为

1,2,3,1,4,3,2,1,4。

因为N「1,9」= 5,必胜策略是把值为4的子状态变成1,简单算一下,N「8」= 1,N「2,6」= 1,所以必胜策略包括击倒3号,5号,9号,11号瓶。

KAYLES游戏的NIM值已经完全解出:除了少数例外,以12为周期取下列值:1,2,8,1,4,7,2,1,8,2,7,4。仅有的13个例外为:N「3」= N「6」= N「18」= N「39」= 3, N「9」= N「21」= N「57」= 4,N「11」= N「22」= N「34」= N「70」= 6,N「15」= 7,N「28」= 5。

类似于问题4,KAYLES中所有单一状态的NIM值也都不是0。实际上也很容易看出,对没有空档的初试状态,必胜策略就是击中央,总数是单数时打一个,双数时打两个。以后保持对称就可以了。

问题7。砍树游戏:在纸上随便画几棵树(例如下图),两人轮流砍。每次可以在任何一个节点处砍掉一枝。可以砍掉整个一棵树。如果一个节点有几个树枝,只能砍掉一枝。最后无树可砍的人负。

就下图而言,先砍能不能获胜?



答案: 如果没有分叉,即每个节点只有一枝,这就变成了标准NIM。有分叉的道理也差不多:左边的树有两枝,中间的树上面两枝可以抵消,中间两枝可以抵消,所以相当于一枝。我们知道在NIM里面(1,2,3)是负状态,所以先砍的人可以把第三棵树左边的小枝砍掉,剩3枝。

对更复杂的树,还有简单算法。

定理。如果在节点处有超过一枝,那么这些枝可以用一枝代替,这一枝的NIM值为这些枝的NIM和。

以右边的树为例,两小枝的NIM值分别为1和2,它们能用值为3的一枝代替,也就是说整个树的NIM值为4。这样就可以清楚的看到唯一正确解是把右边树的NIM值变为3,即砍掉左边小枝。

拿石子类型的游戏多极了,有些是NIM的变种,有些不是,但道理都有点相似。下面给出一些例子:

问题8。有两堆石头,每堆都是100个。现两个人来拿石头,规则如下:
1)只能从一堆拿,至少拿一个,多拿不限;
2)如果某人拿光一堆,这个人可以把另一堆分成两堆,也可以不分;
3)拿最后一个的人赢。
现问先拿者输还是后拿者输?应如何拿?

规则可以稍微改一改:

问题9。有若干堆石子,两人玩拿石子游戏。每人每次可以选下列两种走法之一:任选一堆拿走一个石子,或任选至少有两个石子的一堆,将其分成两堆。什么时候先走的人有必胜策略?

问题10。有若干堆石子,两人轮流拿,每次从其中一堆中拿一个。拿走的石子可以扔掉,也可以加在后面挨着的一堆上。(如果从第3堆拿一个,拿走的石子可以扔掉,也可以加在第4堆上,即使第4堆当时是空的也可以。如果从最后一堆拿,就只能扔掉了。)拿最后一个的胜。

假设一开始有5堆,每堆一个,先拿有没有必胜策略?有几种?

问题11。和第1题一样,但是拿走的一个可以加在后面任意一堆上。(如果从第3堆拿一个,一共有7堆,可以加在第4到第7的任意一堆上。)

还是一开始有5堆,每堆一个,先拿有没有必胜策略?有几种?

问题12。有一堆石子共N颗(N>1),两人轮流从中取石子,其数目依次是a1, b1, a2, b2, ....。取石子的规则是:
(1) 第一次不能拿完,即:1≤a1≤N-1;
(2) 以后每人取石子数不能超过对方刚取的数。即:a1≥b1≥a2≥b2≥ ....≥1;
取最后一颗石子的为胜者。什么时候有必胜策略?第一次应该拿几个?

问题13。桌上有一堆石子。你和对手轮流拿。谁拿到最后一颗算谁胜。规则是:
1。第一个人第一次不能拿完。
2。从第二次开始,每次所能拿的颗数是从一到两倍于你的对手上一次拿的颗数。比如你的对手上次拿了4颗,那么你就可以拿1颗到8颗里的任意数。
什么时候有必胜策略?第一次应该拿几个?

问题14。桌上有15个球。两人从中论流取球,每次可以取1,2,3个,最后取完这15个球后,看谁总共取的球数是奇数谁赢。第一次应该拿几个?

问题15。桌上有15个球。两人从中轮流取球,每次可以取1到4个,最后取完这15个球后,看谁总共取的球数是奇数谁赢。第一次应该拿几个?

[ 打印 ]
阅读 ()评论 (1)
评论
yxwu 回复 悄悄话
对拿石子游戏(NIM) 理论的疑问


可能数学专业人士的思想太复杂,很多问题其实很简单:


问题4。(和上一题差不多。)有一块6X8的矩形巧克力,左下角那一块坏了。两人分吃,每次掰时,先选定一块,然后把这块及其上面和右面的都掰掉。(剩下的是锯齿形。)吃最后一块为负。第一次应该掰多少?

这一题的NIM值就很难算了,要编一个程序才行。下面是矩形的NIM值。(还不包括锯齿形。)

5,8,12,16,21,13,28,32
4,7,11,13, 6,21,23,22
3,5, 9, 6,13,16,19,12
2,4, 5, 9,11,12,13,16
1,2, 4, 5, 7, 8,10,11
0,1, 2, 3, 4, 5, 6, 7

==〉很简单的掰掉0 的上方 1 的那块留下0 这块不就行了吗?



下面按照 NIM 路线算出来的又是必败策略:

-------------
在NIM游戏里,初始状态「3,5,7」的必胜策略是什么?状态「3,5,8」的必胜策略又是什么?状态「3,4,5,6,7」呢?

前面已经算过这个初始状态的NIM值N「3,5,7」为1,必胜策略就是从任何一堆拿一个就行了。

一般来说,先把NIM值表成二进位数,找一个在NIM值的最高位为1的子状态,然后比较整个状态和子状态的NIM值。所有整个状态为1的位上,子状态是1就改成0,是0就改成1。

例如「3,5,8」的NIM值为14 = (1110),最高位是第四位。8 = (1000)的第四位为一,所以这个子状态的NIM值应变为(0110) = 6。必胜策略就是在8的一堆上拿两个。

「3,4,5,6,7」的NIM值是3 = (11)。要找一个第二位为1的子状态,3,6,7都可以。大家可以自己算一下应该拿几个。(答案:3,7拿3个,6拿1个)

NIM还有一个变种:走最后一步为负。这种情况下,一开始还是和普通NIM一样,但到了只有一个子状态的NIM值大于1时就不同了。如果有奇数个子状态为1,就把大的一堆拿光,如果有奇数个,就剩一个。也就是说,给对手剩下奇数个1。

---------------------
对上面所有问题,我的胜策很简单:先拿者胜!
每堆拿剩一个,最后一堆全拿光。
如果走最后一步为负,则在拿最后一堆时仍留一个。

--------------------------


下面这个按NIM值计算出来的结果也有问题:

-------------
问题6。现代保龄球是由古希腊一种叫KAYLES的游戏发展而来。KAYLES的规则如下:11个瓶排成一排,两人交替击瓶,可以击倒任意一瓶,也可以击倒相邻两瓶(不准故意击不中)。击倒最后一瓶为胜。现在对手击倒2号瓶,问怎样才能获胜?

这个游戏的特点是可以产生出新的子状态。一开始是状态「11」,现在变成了「1,9」。但所有的原理仍然有效。可以算出前9个数的NIM值为

1,2,3,1,4,3,2,1,4。

因为N「1,9」= 5,必胜策略是把值为4的子状态变成1,简单算一下,N「8」= 1,N「2,6」= 1,所以必胜策略包括击倒3号,5号,9号,11号瓶。
----------------

我的策略就将完全击败 NIM 计算:

1, ,3,4,5,6,7,8,9,10,11 轮康MM, 按照上面算的必胜策略包括击倒3号
1,,,4,5,6,7,8,9,10,11 轮对手,击倒7,8两瓶
1,,,4,5,6,,,9,10,11 轮康MM,
此时无论康MM选哪一个或两个击,都将输掉。

例如:
康MM选 1 ==〉4,5,6,,,9,10,11
对手选 4 ==〉5,6,,,9,10,11 此后,无论康MM 怎么选,都会输
例如:康选5或者6,对手就选9,10; 康选5,6,对手选10;康选10,对手选5,6。。。

又例如:
康MM选 4(或6,9,10都一样) ==〉1,,,5,6,,,9,10,11
对手选1, ==〉5,6,,,9,10,11 回到了上面的例子

又例如:
康MM选 5(或10都一样) ==〉1,,,4,,6,,,9,10,11
对手选9,10 ==〉1,,,4,,6,,11 仍然是对手胜!

所以NIM理论很值得怀疑!(说实在的,我都没有搞明白康MM的NIM值是怎样算出来的).
登录后才可评论.