2021-03-26:给定一个正整数N,表示有N份青草统一堆放在仓库里。有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草。不管是牛

举报
福大大架构师每日一题 发表于 2021/03/26 22:24:47 2021/03/26
【摘要】 2021-03-26:给定一个正整数N,表示有N份青草统一堆放在仓库里。有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草。不管是牛还是羊,每一轮能吃的草量必须是:1,4,16,64…(4的某次方)。谁最先把草吃完,谁获胜。假设牛和羊都绝顶聪明,都想赢,都会做出理性的决定。根据唯一的参数N,返回谁会赢。福大大 答案2021-03-26:1.自然智慧即可。递归。2.根据结果反推,找规律。N被5整除...

2021-03-26:给定一个正整数N,表示有N份青草统一堆放在仓库里。有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草。不管是牛还是羊,每一轮能吃的草量必须是:1,4,16,64…(4的某次方)。谁最先把草吃完,谁获胜。假设牛和羊都绝顶聪明,都想赢,都会做出理性的决定。根据唯一的参数N,返回谁会赢。

福大大 答案2021-03-26:

1.自然智慧即可。
递归。

2.根据结果反推,找规律。
N被5整除,余0或者余2,后手赢。

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

package main

import "fmt"

func main() {
    for i := 0; i <= 50; i++ {
        fmt.Println(i, " : ", winner1(i), winner2(i))
    }
}

// 如果n份草,最终先手赢,返回"先手"
// 如果n份草,最终后手赢,返回"后手"
func winner1(n int) string {
    if n < 5 {
        if n == 0 || n == 2 {
            return "后手"
        } else {
            return "先手"
        }
    }
    base := 1
    for base <= n {
        if winner1(n-base) == "后手" {
            return "先手"
        }
        if base > n/4 { // 防止base*4之后溢出
            break
        }
        base *= 4
    }
    return "后手"
}
func winner2(n int) string {
    if n%5 == 0 || n%5 == 2 {
        return "后手"
    } else {
        return "先手"
    }
}

执行结果如下:
图片


左神java代码
评论

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。