编程之美 - 抓石头游戏(2)

来源:互联网 发布:知乎客厅地板还是地砖 编辑:程序博客网 时间:2024/06/06 03:11
游戏规则: 
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

一,二,三步循环相当于抓取次序的循环,那先抓的一定会赢。


示例程序:
示例程序为一个人和电脑轮流抓取的一个游戏,人的输入为两个整数用空格分隔,第一个整数表示堆号,第二个整数表示抓取的块数。
测试数据可以自己构造任意堆的石头。电脑会保证自己赢。


示例工程及代码




0 0
原创粉丝点击