Nim游戏(博弈论)

标准 Nim 游戏规则

游戏有若干堆石子(数量≥1),每堆有一定数量的石子(数量≥1)。两人轮流行动,每次行动需从任意一堆中取走至少 1 颗石子(可整堆取完)。最后取走石子的人获胜

判断当前局面(各堆石子数量)的胜负,只需计算所有堆石子数量的异或和(也叫 "Nim 和"),规则如下:

  • 若所有堆的石子数异或和为 0 :当前玩家处于必败局面(无论怎么操作,对手都能找到应对策略最终获胜)。
  • 若所有堆的石子数异或和不为 0 :当前玩家处于必胜局面(存在至少一种操作,能让对手陷入必败局面)。

"异或和是否为 0" 本质是 "所有位的奇偶是否都平衡"对于二进制的每一位(比如最低位、次低位、更高位等),所有堆的石子数在该位上的 "1" 的总个数是偶数

异或和非0,意味着多一个1出来,这样先手通过操作让石子堆的异或和变成0,比如变成2 2,那么先手一定能拿到最后的一个棋子。

cpp 复制代码
// 计算异或和
int calculateXOR(const vector<int>& piles) {
    int xorSum = 0;
    for (int pile : piles) {
        xorSum ^= pile;
    }
    return xorSum;
}