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("先手赢") } }
执行结果如下: