阅读 50

LeetCode——292. Nim 游戏(Java)

题目描述

题干:
你和你的朋友,两个人一起玩 Nim 游戏:
桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。
请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。
如果可以赢,返回 true;否则,返回 false 。

示例 1:
输入:n = 4
输出:false 
解释:如果堆中有 4 块石头,那么你永远不会赢得比赛;
     因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

示例 2:
输入:n = 1
输出:true

示例 3:
输入:n = 2
输出:true

题解思路

返回是否可以赢下游戏,当然这种问题就是属于头脑风暴了,因为你先手和每次都是最优解

所以其实在一开始你的输赢就已经敲定了,只要你能控制在数量为4的时候是对方的回合

那无论他拿多少个你都能获取最后的胜利,但是这里还有个规律就是,因为每次只能拿到1到3个

所以每次遇到4的倍数,对面也可以让你一直卡在4的倍数上,所以只要是4的倍数就必须是对面的回合

正确代码

    public boolean canWinNim(int n) {
        if (n % 4 == 0) {
            return false;
        } else {
            return true;
        }
    }

总结

脑筋急转弯问题,以前遇到一个算法题也是你每次先手,但是规则不同,那道题是直接return true

因为只要你作为先手,总有方法让自己获得最终的胜利,果然学好数学思维是多么的重要

如果文章存在问题或者有更好的题解,欢迎大家在评论区斧正和评论,各自努力,你我最高处见

原文:https://www.cnblogs.com/bc-song/p/15307067.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐