码迷,mamicode.com
首页 > 其他好文 > 详细

尼姆堆

时间:2018-03-18 12:02:57      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:硬币   main   col   不能   string   异或   public   return   bsp   

有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);
    }
}

 

尼姆堆

标签:硬币   main   col   不能   string   异或   public   return   bsp   

原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8594536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!