Nim 博弈

进阶

Nim 博弈是博弈论的入门问题,SG 函数的基础。

Nim 博弈

演示 Nim 博弈的 SG 函数计算过程。

AlgoAnim · Nim 博弈

待机

速度
待机
// 源代码
1bool nimGame(vector<int>& piles) {
2    int xorSum = 0;
3    for (int x : piles) xorSum ^= x;
4    return xorSum != 0;
5}

复杂度分析

时间 O(n)
空间 O(1)
最优 O(1)
最坏 O(n)

算法讲解

有 n 堆石子,两人轮流从任意一堆中取至少一个,取走最后一个石子的人获胜。

先手必胜当且仅当所有堆的异或和不为 0。

先手必败当且仅当所有堆的异或和为 0(Nim-Sum = 0)。

SG 函数是解决更一般博弈问题的工具。