基础:
1.NP状态
N(next):此状态的先手必胜;
P(perv):此状态的后手必胜;
2.游戏的和
如果G1和G2 是公平游戏,那么他们的和G1 + G2是另一个公平游戏,玩法如下:每个回合,一个玩家选择G1, G2 中的一个(随便哪个他希望的)然后玩它,不碰另一个游戏。当 G1 和 G2都不能操作时游戏结束。
Sprague-Grundy 函数:
状态v的Grundy值(我更习惯叫SG值)等于没有在v的后继状态的Grundy值中出现的最小自然数。
∴结束状态的Grundy值为0.
计算SG值:(最简单的拿石子,take为每次可拿的石子数)
memset(sg,0,sizeof sg);
for(int i=1,j;i<MAXS;i++)
{
memset(vis,0,sizeof vis);
for(j=1;j<=tn;j++)
if(i>=take[j])
vis[sg[i-take[j]]]=1;
for(j=0;vis[j];j++);
sg[i]=j;
}
SG值的一些性质:
1.sg[i]==0说明i是P状态,sg[i]>0说明是N状态;
∵sg[I]>0说明I能走到sg值为0~I-1的所有状态,而结束状态一定是0,所以I是N状态;
∴sg[I]==0说明i不能走到任何sg为0的点,所以为P状态。
2.如果G = G1 + G2 且 v = v1v2 是G的一个状态,那么sg(v) 为sg(v1) 和 sg(v2) 在二进制下的异或:sg(v) = sg(v1) ⊕ sg(v2).
(证不来。。。)
可以解决很多问题:
(待完成)