先来一道例题:
甲,乙两个人玩NimNimNim取石子游戏。
nimnimnim游戏的规则是这样的:地上有nnn堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这nnn堆石子的数量,他想知道是否存在先手必胜的策略。
这道题有一个神奇的结论:当nnn堆石子的数量异或和等于000时,先手必胜,否则先手必败。
看网上大部分对于这个结论中异或的出现解释的都不是很清楚,这里想结合自己的想法谈一下这类问题的解法。
一、了解定义
我们要知道博弈问题通常有的两种状态:必胜态和必败态。
所谓必胜态,就是在当前的局面下,先手必胜
必败态,就是在当前的局面下,先手必败。
那么,这个游戏的必败态我们显然知道,就是所有石子堆都为000时。
二、从简单入手
我们可以用一个nnn元组(a1,a2,…,ana_1, a_2, …, a_na1,a2,…,an)来表示每一个局面,
例如,(3,3,1)(3,3,1)(3,3,1)表示一共三堆石子,第一二堆有三个,第三堆有一个。
显然(3,3,1)(3,3,1)(3,3,1)和(1,3,3)(1,3,3)(1,3,3)是同一种局面,即交换每堆顺序不影响答案。
如果初始局面只有一堆石子,则甲有必胜策略。
甲可以一次把这一堆石子全部取完,这样乙就无石子可取了。
如果初始局面有两堆石子,而且这两堆石子的数目相等,则乙有必胜策略。
因为有两堆石子,所以甲无法一次取完;
如果甲在一堆中取若干石子,乙便在另一堆中取同样数目的石子;
根据对称性,在甲取了石子之后,乙总有石子可取;
石子总数一直在减少,最后必定是甲无石子可取。
对于初始局面(1),甲有必胜策略,而初始局面(3, 3),乙有必胜策略。
局面的加法:(a1,a2,…,an)+(b1,b2,…,bm)=(a1,a2,…,an,b1,b2,…,bm)(a_1, a_2, …, a_n) + (b_1, b_2, …, b_m) = (a_1, a_2, …, a_n, b_1, b_2, …, b_m)(a1,a2,…,an)+(b1,b2,…,bm)=(a1,a2,…,an,b1,b2,…,bm)
所以(3)+(3)+(1)=(3,3)+(1)=(3,3,1)(3) + (3) + (1) = (3, 3) + (1) = (3, 3, 1)(3)+(3)+(1)=(3,3)+(1)=(3,3,1)。
对于局面A,B,SA, B, SA,B,S,若S=A+BS=A+BS=