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

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代码

posted @   福大大架构师每日一题  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示