游戏规则: N块石头,两个玩家 A,B,A负责将石头分成M堆,然后按BABA顺序来抓取, 每人每次可以从任意堆抓取大于1的任意块石头,取得最后一块石头的人赢。
书中的分析: 如果每堆石头只有一块,当M是奇数的时候,一定是先抓的赢。
如果有两块石头,分成两堆 1:1,那先抓的一定输。 扩展一下,如果有偶数块石头,平均分成两堆 X:X,那先抓的一定会输。
联想到XOR 运算
0 xor 0 = 0 0 xor 1 = 1
1 xor 1 = 0
X xor X = 0
当 0 xor 0 结果为 0 时,游戏已经结束了。
把两堆扩展到M堆,道理也是同样。
M1, M2, M3, … Mn
如果N是奇数,
第一步, M1 xor M2 xor M3 …… xor Mn != 0: 因为奇数可以分解为奇数个奇数或奇数和偶数,在运行xor时最后一位一定会是1,它不会为 0
第二步, M1` xor M2`
xor
M3`
…… xor Mn` = 0: 经过第一次抓取后,第二个人总是可以把第一次抓取的结果转换为 xor = 0
相当于转换为偶数的状态,
第三步, M1 xor M2
xor
M3 …… xor Mn != 0: 第三步的值又会被转换为不等于0
一,二,三步循环相当于抓取次序的循环,那先抓的一定会赢。
示例程序: 示例程序为一个人和电脑轮流抓取的一个游戏,人的输入为两个整数用空格分隔,第一个整数表示堆号,第二个整数表示抓取的块数。 测试数据可以自己构造任意堆的石头。电脑会保证自己赢。