(可能顺序很乱,但为了保持原状,我不做修改了..这就是我体验博弈时的顺序)
分析局面,而不是谁胜谁负!!!
Terminal局面:无法做出move的局面
Previous局面:无论做出哪种move,都会造成N局面的局面
P-->当前的前人会获胜,所以当前败
Next局面:至少有一个move可以造成P局面
N-->当前胜
T局面是P还是N要根据规则判断(无法移动则输:T=P;无法移动则赢,或者说最后取子则输:T=N)
N必胜的方法:每次移动到P即可,就可以保证必胜
普通规则下:
g(x)=mex{g(y)|y属于x的后继},x=T,g(x)=0(递归的边界情况)
x为T时,g(x)=0
g(x)=0 ==> P
g(x)!=0 ==> N
g(x)的物理意义:g(x)==0,表示x的后继局面中没有P局面,那么当前局面是P局面,表示无法必胜;当g(x)>0时,表示至少有一个后继局面为P局面,证明当前局面为N,必胜
证明步骤:1.证明T局面满足;2.证明对P局面而言,确实没有能造成N局面的移动;3.证明N局面至少有有一种移动造成P局面
注意,证明过程中一般涉及到量的减少,可能要用到异或的性质,分析量的变化
异或性质:
a^a=0(a本身是a的逆)
a^0=a(0是单位元)
NIM和定理:
如果一个游戏由多个平行游戏组成,我们可以分别计算其g(x),而G(x1,x2,..,xn)=g(x1)^g(x2)^...^g(xn).这样就避免了在计算G(x1,x2,..,xn)的时候需要把所有的情况都遍历一遍G(x1,x2,..,xn)=g(x1)*x2*..*xn * x1*g(x2)*..xn..
这样就把一系列乘法阶的复杂度,降低为加法阶
NIM的sg
g(x)=a1^a2^..^an
Subtraction的sg
g(x)=x(%m+1)(m是最大的数)