赞
踩
只有一堆n个石子,两个人轮流从这堆石子中取石子,规定每次至少取一个,最多取m个,最后取完的人获胜。
其中上述的情况1和3可以合并,故:
有一堆个数为n的石子,游戏双方轮流取石子,满足:
先说结论:
当且仅当n不是Fibonacci数时,先手必胜。换句话说,先手必败构成Fibonacci数列。
证明需要前置技能,“Zeckendorf定理”(齐肯多夫定理),其表述为:任何正整数可以表示为若干个不连续的Fibonacci数之和。
具体证明在这篇博文中给出,有兴趣的读者可以自行学习。
有两堆各若干个石子,两个人轮流从某一堆或者两堆中取同样多的物品,规定每次至少取一个,多着不限,最后取完石子的人获胜。
设这两堆石子分别有(A,B)个,并且A<=B。我们先来看一下先手必败的局势。
其他的先手必败局势
(4,7),(6,10),(8,13),(9,15),(11,18).
我们将先手必败局势的集合,称为奇异局势。
我们可以发现,将所有奇异局势按照第一堆的石子的数目从小到大排列,每个奇异局势的差值是自然数列。
进一步观察发现,对于一个奇异局势(A,B), A = 下取整[ (B-A) * 1.618 ],更准确的说,1.618 = (sqrt(5) + 1) / 2.
为什么会是这样的? 具体的证明涉及到Betty的定理,有兴趣的读者可以百度,这里不再赘述。
有三堆石子, 每堆有若干个,两个人轮流从某一堆中任取石子,每次至少取一个,多者不限,最后取完者获胜。
用(A,B,C)来表示某一特定局势,同时规定A<=B<=C。奇异局势表示先手必败。
对于一个奇异局势(A,B,C),我们可以发现,A(XOR)B(XOR)C = 0。
下面一条需要的前置技能
设有数字a,b,a(XOR)b(XOR)(a(XOR)b) = (a(XOR)a)(XOR)(b(XOR)b) = 0
对于一个非奇异局势(A,B,C),我们只需要将C转化为(A(XOR)B)即可,而将C转化为(A(XOR)B)的操作为,C = C-(A(XOR)B)即可。
注:
SG函数为计算博弈状态的函数,当SG[X] = 0时,说明先手必败。
为了求解SG函数,首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于任意状态 x , 定义 SG(x) = mex(S),其中 S 是 x 后继状态的SG函数值的集合。如 x 有三个后继状态分别为 SG(a),SG(b),SG(c),那么SG(x) = mex{SG(a),SG(b),SG(c)}。
这样 集合S 的终态必然是空集,所以SG函数的终态为 SG(x) = 0,当且仅当 x 为必败点P时。
说起来很抽象,举一个具体的例子来说明一下。
有1堆n个的石子,每次只能取{ 1, 3, 4 }个石子,先取完石子者胜利,那么各个数的SG值为多少?
SG[0] = 0(显然没有石子可取时必败);
f[] = {1,3,4}(表示每次取有3中方案,取1个,取3个,取4个);
当石子x = 1时,可以取走1-f{1}个石子,SG[1] = mex(SG[1-1]) = mex(0) = 1;
当石子x = 2时,可以取走2-f{1}个石子,SG[2] = mex(SG[2-1]) = mex(1) = 0;
当石子x = 3时,可以取走3-f{1,3}个石子,SG[3] = mex(SG[3-1],SG[3-3]) = mex(0,0) = 1;
当石子x = 4时,可以取走4-f{1,3,4}个石子,SG[4] = mex(SG[4-1],SG[4-3],SG[4-4]) = mex(1,1,0) = 2;
以此类推…
我们可以打出SG函数的表,根据表来判断是先手必胜还是先手必败。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。