Nim游戏(博弈论中的组合数学问题)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Nim游戏——博弈论中的经典问题(组合数学里的知识)Nim取子游戏

Nim取子游戏的解依赖于奇偶性,是组合数学里的一个重要问题

Nim取子游戏就是两个人面对若干堆硬币(石子、豆粒……)进行的游戏。设有k>=1堆硬币,各堆分别含有n1,n2……nk枚硬币,按下列规则取,直到最后没硬币可取,那个人就判输!!

规则:

1、有两名选手,分别为I 和II

2、两名选手交替进行取硬币活动,至少在一堆中取一枚硬币

3、对于任何一种局面,和局面的过去与未来无关

4、最后无硬币可取的人判输!!

推理证明:

假设两个游戏人I 、II。假设有两堆硬币n1、n2。游戏人I先去,游戏人I能否获胜与n1、n2的值的大小无关,而取决于n1是否等于n2.

假设n1 不等于n2,先游戏人I取较大的堆中使其与较小的堆中硬币数目相等。然后游戏人II取任意一堆中的任意枚硬币,然后游戏人I取另外一堆中与游戏人II相同的数目,直到最后,可以看出最后游戏人I 获胜。

若n1 == n2,则游戏人I先取,游戏人II按上面的游戏人I的取法去取,最终可以看出游戏人II 获胜。

举个例子:

(8 , 5) ---- 游戏人I ---→ (5 , 5) ----游戏人II ---→ (5 , 2) ---- I -→ (2 , 2) --- II —>(0,2) ---- I --→ (0,0)

从两堆石子的取法可以推广到k堆石子的取法,先来看一下,两堆石子的具体取法是怎样进行的?

先将n1和n2表示成二进制的数的形式!!!

例如57 = 2^5 + 2^4 + 2^3 + 2^0 = 111001

这样我们就可以将一堆硬币看成有2的幂数的子堆组成,于是57就可以看成有2^5 ,2^4 ,2^3 ,2^0的各子堆组成。在两堆Nim取石子游戏中,各种大小的子堆的总数只能是0,1,2。各种子堆的总堆数是偶数当且仅当游戏中的2堆具有相同的大小,也就是说,游戏人II获胜。反之,游戏人I获胜。

现在考虑各堆大小分别为n1,n2,……nk的一般的Nim取子游戏。将数ni表示成二进制数:N1 = as……a1 a0

N2 = bs……b1 b0

…………

Nk = es……e1 e0

当且仅当

as + bs + ….+es = 偶数

ai + bi + …. + ei = 偶数

a0 + b0 + ….+e0 = 偶数

Nim 取子游戏才是平衡的,否则,就是不平衡的

于是我们有:

游戏人I能够在非平衡的Nim取子游戏中获胜,而游戏人II能够在平衡Nim取子游戏中获胜。

{为了判断是否是平衡的,可以运用位运算中的异或操作来实现} Input(n); sum = 0;

For(I = 1;I <= n;I ++)

Do: Input(num);

Sum ^= num;

If(sum > 0) //非平衡状态

Printf(“游戏人I获胜”);

Else

Printf(“游戏人II获胜”);<参考poj2234 hdu 1730>

举个例子:

7、9、12、15

2^3=8 2^2=4 2^1=2 2^0=1

_______________________________________________________________________________大小为7的堆0 1 1 1

大小为9的堆 1 0 0 1

大小为12的堆 1 1 0 0

大小为15的堆 1 1 1 1

由此可以看到这局游戏是非平衡的,其中3号位、2号位、0号位都是非平衡的。游戏人I 可以选择大小为12的堆并取走11枚硬币,只剩下1枚硬币,1 = 0001,使其变成平衡的。同理,也可以选择大小为9的堆取走5枚硬币剩下4枚,或者,选择大小为15的堆取走13枚,剩下2枚硬币。

.sg/~limchuwe/cgt/

相关文档
最新文档