Nim:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,每次最少取一件,取到最后一件物品的人获胜。
结论:把每堆物品数全部异或起来,如果得到的值为0,那么后手胜,否则先手胜。
现在对于N堆物品,重新定义取石子方式,那什么策略才能先手赢?
SG函数:就是把新Nim回归到原始Nim,然后按照原始Nim进行各种操作.
SG[x]=Rmax(SG[u]|uϵ
S
G
[
x
]
=
R
m
a
x
(
S
G
[
u
]
|
u
ϵ
{x子节点}
)
)
<script type="math/tex" id="MathJax-Element-12">)</script>,SG函数就是对子节点u和Rmax(SG自定义函数)的理解.
例如:你的操作方式为每次取2,3,4个石子,那么你取的那堆石头(x个石子)所剩下的石子数就是子节点(如下图).
以上就是对于子节点的定义.
Rmax其实也很简单,就是SG[u]在自然数(0,1,2,3…)中没有出现的最小数字(如下图).
此时sg[5] = 0; 倘若sg[u] = {0,1,3},那么sg[x] = 2;倘若sg[u] = {0,1,2},那么sg[x] = 3 …
SG函数弄懂之后,就是回归到原始Nim。其实可以发现,原始Nim的sg[x] = x。所以同理,每一堆的sg[x]异或之后等于1先手胜,否则后手胜,回归到最原始的Nim操作,注意sg[x]是一种映射关系。
SG例题.