292.[LeetCode]Nim Game

题目大意:

你和你的小伙伴在玩一种游戏,给定 N 个小石头,每次可以拿取 1/2/3 个石头,谁能拿到最后一个就赢了。
给定 n 个石头,你是先手,判断是是否可以赢。

前提:你和小伙伴都不是傻逼


思路:

首先思考没有只能 拿一次的情况下,先手必胜的情况:

ncanWin
1
2
3

从第4个起,就是有交换手了,有4个的时候,无论拿多少个,都会导致对方进入 先手必胜 的条件,就是还剩1,2,3个,所以剩下4个 是 先手必败状态

ncanWin
4

因为之后都是有交换手的,所以我们应该做的是能 确保 对手进入必败的状态,比如有5个的时候,我们可以拿1个,让还剩四个,并且是对手拿,让对手进入先手必败状态

同理,6个的时候我们可以拿2个让对手先手必败状态,7个的时候拿3个。

ncanWin
5
6
7

但是到了 有8个 的情况下,无论我们那1,2,3个都不能让对手在他的回合,进入先手必败状态了,所以8是一个 先手必败状态

ncanWin
8

而到9个的时候,我们可以让拿走一个,让对手进入 目前确定了 先手必败状态 — 8个的时候

这样不断的维护,我们可以发现这是一个非常简单的循环问题。

代码
class Solution {
public:
    bool canWinNim(int n) {
        if(n%4 == 0) return false;
        else return true;
        // 或者 return n%4;
    }
};
总结:

很简单编码,有同学说面试的被问到过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值