尼姆堆

Posted 机智的小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尼姆堆相关的知识,希望对你有一定的参考价值。

有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。

求先取硬币一方有无必胜的招法。

// 尼姆堆的模2加(异或)解法
/*
    10
   101
  1100
  1110
--------
  0101  
*/
public class Main {
    static void f(int[] a) {
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum ^= a[i];
        }
        if (sum == 0) {
            System.out.println("输了");
            return;
        }

        for (int i = 0; i < a.length; i++) {
            int x = sum ^ a[i];      //x ^ y ^ y得到的还是x, 我们把sum跟某个异或,得到和其他三个异或的情况,然后再和这三个异或就得到sum初值
            if (x < a[i])
                System.out.println(a[i] + " --> " + x);
        }
    }

    public static void main(String[] args) {
        int[] a = { 2, 5, 12, 14 };
        f(a);
    }
}

 

以上是关于尼姆堆的主要内容,如果未能解决你的问题,请参考以下文章

尼姆博奕+SG函数

博弈—尼姆博弈

尼姆博弈

(HDU - 2176)取(m堆)石子游戏(尼姆博弈)

尼姆博弈

HDU 2176 取(m堆)石子游戏 尼姆博弈