描述:
尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限。取走最后石子的人获胜。
标准解法:
判断:
先计算先手是必胜还是必败:
将每堆石子的数量做二进制异或(即用二进制表示,每个数字的第一位做异或;第二位做异或...),结果如果是0,则必败;否则必胜。
(其实每个二进制位如果有偶数位1,则异或结果是0,否则为1;异或符合结合律,交换律)
做法:
如果是必胜局如何操作:
必胜局则异或结果不是0,操作某一堆,使得异或结果是0。
证明:
这其实是ICG游戏的标准解法。找到P态和N态(也称奇异非奇异局势,平衡态、终态等):
P态:必败态,P态的任一操作都将使局面转为N态;
N态:必胜态,N态可以一步转为P态;
其实不用管上面的理论也行,只有证明以下结论即可:
1.对于一个异或和为0的局面,任一操作都将使其不为0;
2.对于一个异或和不为0的局面,存在一个操作使其为0;
对于1:由于只能操作一个数,至少减一,则有:
如果改变后的数的二进制表示中,1对应的位完全和原来一样,则必定有0改为了1,导致改变后的数大于原数,矛盾。
所以,改变后的数二进制中,至少有1个1变成了0,则改位的异或和改为了1,证毕。
对于2:可以通过改变1的奇偶来改变异或和(可以通过删除1或增加1):
设从高到低,含有奇数列的序号位w1, w2 ,w3...
任意选取最高列中,1所在的数。删除这个1,实际是分配w1 - 1个1给这个数后面的任一列。
则这行中,多出的1删去,少了的补上即可。
如:
5: 0 1 0 1
10:1 0 1 0
1: 0 0 0 1
4: 0 1 0 0
其中奇数号列位4,2,而第四列中,10的最高位的1可删除,删去1(实际是删去8),
后面可任意改变数量,而第二列中也多出1,删去。得0。即10全部取走。
由于0,0,0是异或和为0的状态,只要一直将异或为0的状态交给对方,由于数量一直减少,则自己总能到达0,0,0态,取得胜利。