先来一道例题:
甲,乙两个人玩 N i m Nim Nim取石子游戏。
n i m nim nim游戏的规则是这样的:地上有 n n n堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n n n堆石子的数量,他想知道是否存在先手必胜的策略。
这道题有一个神奇的结论:当 n n n堆石子的数量异或和等于 0 0 0时,先手必胜,否则先手必败。
看网上大部分对于这个结论中异或的出现解释的都不是很清楚,这里想结合自己的想法谈一下这类问题的解法。
一、了解定义
我们要知道博弈问题通常有的两种状态:必胜态和必败态。
所谓必胜态,就是在当前的局面下,先手必胜
必败态,就是在当前的局面下,先手必败。
那么,这个游戏的必败态我们显然知道,就是所有石子堆都为 0 0 0时。
二、从简单入手
我们可以用一个 n n n元组( a 1 , a 2 , … , a n a_1, a_2, …, a_n a1,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),乙有必胜策略。
局面的加法: ( a 1 , a 2 , … , a n ) + ( b 1 , b 2 , … , b m ) = ( a 1 , a 2 , … , a n , b 1 , b 2 , … , b m ) (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 , S A, B, S A,B,S,若 S = A + B S=A+B S=A+B,则称局面 S S