1.无法进行任何移动的局面(terminal position)是P-position.(先手必败)
2.可以移动到P-position的是N-position.(先手必胜)
3.所有可行的移动都导致N-position的是P-position.(先手必败)
mex(minimal excludant)运算:
对一个集合进行运算,返回不属于这个集合的最小非负整数.例如:mex{0,1,2,4}=3;mex(2,3,5)=0;mex{}=0.
更为一般的游戏:
给定一个有向无环图和一个起始点顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负.这个游戏是所有Impartial Combinatorial Games的抽象模型.
在这个游戏的基础上定义sg函数:
sg(x)=mex{sg(y)|顶点y是x的后继}.
1.terminal position对应没有出边的顶点i,sg(i)=0,对应于P-position,先手必败.
2.如果一个顶点i的sg函数值sg(i)=0,则它的所有后继顶点j都满足sg(j)!=0,此时的顶点i对应P-position,先手必败.
3.如果一个顶点i的sg函数值sg(i)!=0,则它的全部后继顶点中,至少存在一个顶点j满足,sg(j)=0,此时的顶点i对应N-position,先手必胜.
按照这个方法,可以求出图中每个顶点的sg函数值,不仅可以得到解,还可以得出求解的状态转移过程.
但是这种方法还是很复杂的,时间复杂度很高.
游戏的扩展:
有向图中并不是只有一枚棋子,而是有n枚棋子,每次可以任意选择一颗进行移动,这时,如何求解?
sg函数与nim游戏的对应理解:
当g(x)=k时,表明对于任一个0<=i<k,都存在x的一个后继y满足g(y)=i.也就是说,当某枚棋子的sg值是k是,移动这枚棋子,可以将其sg值变成0,或者1,或者2.....或者k-1,但绝对不能保持k不变.
如果把这n枚棋子看成n堆石子,第i枚棋子的sg值看成第i堆石子的数量(1<=i<n),则这两个游戏在本质上就是等价的.在有向无环图上任选一个棋子(sg值为m)移动到下一个顶点(sg值为n)等价于在n堆石子中任选一堆石子(石子总数w为m)拿出m-n个石子(剩下的石子堆石子总数为n)(0<=n<m).
这里有几点值得注意:
基本的nim问题terminal position只有一个,就是所有的石子数量都为0,同时每一个石头堆(数量为n),可以拿掉任意数量个石子i(1<=i<n).
所以基本的nim问题对应的有向无环图也必须相应的满足以上两个条件!
比如当只有一堆石头(数量为3)的时候,这个nim问题对应的有向无环图为:
为什么会有异或运算强势介入:
基本nim游戏的唯一terminal position为所有石子堆的石子个数为0,此时n堆石子的二进制表示的异或运算和s为0.也就是P-position状态下s=0,先手必输.
当至少有一堆石子的数目不为0,即处于非terminal position时:
如果s=0,则无论如何行动,结果都会导致s!=0,因为t = s ⊕xk ⊕ yk,Xk和Yk不相等.由P-position转为N-position.
如果s!=0,则一定可以采取适当的策略使得s=0,t =s ⊕xk ⊕ (s ⊕xk)适当选取Xk,可以保证移动是合法的.由P-position转为N-position.
异或运算的出现,使得不用一步一步的进行计算(判断所有可能的情况),而是抓住了某种特征,一步到位的完成计算(精髓在此).
一个有向无环图变成多个:
刚才的问题是在一个有向无环图上移动n枚棋子,很容易将其变成在n个完全一样的有向无环图上移动一枚棋子.
定义有向图游戏的和:
设G1,G2,....Gn是n个有向图游戏,定义游戏G是所有游戏的和.
游戏G的移动规则是任意选择一个子游戏Gi并移动上面的棋子.根据Sprague-Grundy Theorem,可以得出:
sg(G)=sg(G1)^sg(G2).....^sg(Gn).也就是说,游戏的和的sg函数值是它的所有子游戏的sg函数值的异或.
更加重要的是,当各个子游戏不同的时候,上面的结论也成立.所以我们完全可以将所有的nim游戏分解成多个子游戏,然后分别求出sg值,最后异或求和,得出解.这样就十分的方便了.