Nim博弈。给定一个正数数组arr,先手和后手每次可以选择在一个位置拿走若干值, 值要大于0,但是要小于该处的剩余。谁最先拿空arr,谁赢。根据arr,返回谁赢 。
两个数的先手必胜策略:比如[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("先手赢")
}
}
执行结果如下: