(重发下这篇原发于 2013-10-13的网易博客)
YY了一下证明,好像终于裹清楚了。
首先我们把游戏描述为一个集合,集合内每个元素都是个游戏,即它的后继局面。
也就是说我们其实用了个非常奇葩的集合来描述游戏。
这个集合是形如{{{}{}}{}}这样的,从来不包含任何有实际意义的元素,只有集合的嵌套。
那么定义必胜:
集合A为必胜当且仅当它的所有元素都是必败的。
集合A为必败当且仅当它的所有元素中有必胜的。
显然这样子我们就把空集定义为必败了。
这样子信息量不够不方便计算。
我们创造性地定义一个函数SG:
SG(A) = 0时A必败,否则必胜。
经过一番艰难地思考,发现如果要搞出这样一个函数,只要知道元素中最小的没有出现过的SG值。因为有0一定大于0,无0一定等于0了。
SG(A) = mex({X | X ∈ A})
mex(T)表示没有出现在集合T里的最小的自然数。
如果SG函数没有什么很神的性质还不如用原来的必胜必败定义呢……
考虑一个经常会遇到的问题:两个游戏的和。有两个游戏A和B,两个人玩,每个人每轮可以操作其中一个,但不能不操作,两个游戏都变为空集时输。
定义运算符+
A + B = {X + B | X ∈ A} ∪ {A + Y | Y ∈ B}
这是个递归定义。
于是我们来考虑SG(A + B)
容易知道:
SG(A + B) = mex({SG(X + B) | X ∈ A} ∪ {SG(A + Y) | Y ∈ B})
现在到了这里,大胆猜想吧……
经过数学家的一番折腾,发现SG(A + B) = SG(A) ^ SG(B)
其中x ^ y指x和y的异或值。
当然是用萌哒哒数学归纳法。
假设集合A、B的所有元素都满足这个性质。
我们证明分两步:
1. SG(A) ^ SG(B) 不属于 {SG(X) | X ∈ A + B}
2. 对于任意0 <= x < SG(A) ^ SG(B), x ∈ {SG(X) | X ∈ A + B}
对于1,显而易见是不行的吧
因为归纳假设SG(X + B) = SG(X) ^ SG(B)
故SG(X + B) = SG(A) ^ SG(B)当且仅当SG(X) = SG(A),矛盾了。
同理SG(A + Y)也不行。
对于2,我们取一个0 <= x < SG(A) ^ SG(B),即证一定满足x ^ SG(B) < SG(A)或x ^ SG(A) < SG(B)
在二进制下,考虑x ^ SG(B)和SG(A),从最高位往最低位,最高的不同的位为i
那么:
如果x ^ SG(B)第i位 < SG(A)第i位,得证。
如果x ^ SG(B)第i位 > SG(A)第i位,则第i位一定有:
SG(A) = 0
x ^ SG(B) = 1
要注意的一点是最高的不同的位为i,说明i位以上x ^ SG(B)与SG(A)均相同,即i位以上x与SG(A) ^ SG(B)均相同
又0 <= x < SG(A) ^ SG(B)
所以第i位,x < SG(A) ^ SG(B)
则第i位一定还有:
x = 0
SG(A) ^ SG(B) = 1
综合刚才的结论,则第i位一定还有:
SG(A) = 0
SG(B) = 1
SG(A) ^ SG(B) = 1
x = 0
x ^ SG(B) = 1
x ^ SG(A) = 0
有没有什么感想……最主要的一点是x ^ SG(A) = 0啊!
故第i位上x ^ SG(A) < SG(B),而且i位以上x与SG(A) ^ SG(B)均相同,得到:
x ^ SG(A) < SG(B)
这就证明了如果x ^ SG(B) > SG(A),则x ^ SG(A) < SG(B)
这样就给出了SG(A + B)的表达式。
SG(A + B) = SG(A) ^ SG(B)
于是这样的题目也可捉了:
Alice和Bob玩游戏,他们有n堆石子,一棵树,一个有个结点染了红色的无向图,一个放了石子的阶梯。
每次可以从某个石子堆中拿走一些石子,或删掉某棵子树但不能为整棵树,或删掉一条边然后去掉不与红色结点相连的连通块,或把一些石子从阶梯上挪到下一层去。
当同时满足石子堆空了,树只剩根,无向图只剩红色结点,阶梯上石子都聚集在最下面时输。
问给定的局面是否必胜。
[这里有一张我无法恢复的图]
如果是不平等博弈,怎么合并呢?
于是我们不仅有先手后手,还有左手右手的区别。
那么我们需要把游戏看成一对集合:(X_L, X_R)
两个集合分别代表左手移动一步能到达的所有可能的游戏局面,右手移动一步能到达的所有可能的游戏局面。
然后发现有个玩意儿叫超现实数,有些特殊的游戏能对应到一个超现实数,然后就帅气了啊……游戏的合并直接能使用加法!
具体请见高德纳写的小说《研究之美》(你没有听错!是本小说!是不是很奇葩!)
我总觉得这种合并很神……