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

游戏规则:  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

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

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

示例工程及代码

    原文作者:zy__
    原文地址: https://blog.csdn.net/wangzhiyu1980/article/details/50683723
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞