2021-05-18:Nim博弈。给定一个正数数组arr,先手和后手每次可以选择在一个位置拿走若干值, 值要大于0,但是要小于该处的剩余。谁最先拿空arr,谁赢。根据arr,返回谁赢 。

福大大 答案2021-05-18:

两个数的先手必胜策略:比如[6,8],先手把数组变成[6,6]。后手不管拿多少,先手保证两个数都一样,这样先手一定会赢。
多个数:所有数异或等于0,后手赢。所有数异或不等于0,先手赢。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    arr := []int{1, 2, 3, 4, 5, 6, 7}
    printWinner(arr)
}

// 保证arr是正数数组
func printWinner(arr []int) {
    eor := 0
    for _, num := range arr {
        eor ^= num
    }
    if eor == 0 {
        fmt.Println("后手赢")
    } else {
        fmt.Println("先手赢")
    }
}

执行结果如下:
图片


左神java代码