「前端刷题」292.Nim 游戏(EASY)

38 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

题目(Nim Game)

链接:https://leetcode-cn.com/problems/nim-game
解决数:1004
通过率:70.5%
标签:脑筋急转弯 数学 博弈 
相关公司:adobe google tencent 

你和你的朋友,两个人一起玩 Nim 游戏

  • 桌子上有一堆石头。
  • 你们轮流进行自己的回合, 你作为先手
  • 每一回合,轮到的人拿掉 1 - 3 块石头。
  • 拿掉最后一块石头的人就是获胜者。

假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

 

示例 1:

输入: n = 4
输出: false 
解释: 以下是可能的结果:
1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
在所有结果中,你的朋友是赢家。

示例 2:

输入: n = 1
输出: true

示例 3:

输入: n = 2
输出: true

 

提示:

  • 1 <= n <= 231 - 1

思路

「你拿到第 n 块石头」,等价于「你拿到第 n - 4 块石头且收手」 因为对手只能选择第 n - 3, n - 2, n - 1 块中的 1, 2, 3 块,不管对手怎么选择,你都可以拿到第 n 块。

假设按如下步骤拿石头:

  1. 你拿 a 块, a = 1,2,3
  2. 对手拿 b 块,你拿 4 - b 块,即步骤2总是拿走4块石头
  3. 重复步骤2总共 c 次后,剩余石头数量 d = n - a - 4c,此时轮到对手拿石头

此时,「你拿到第 n 块」,等价于「你拿到第 n - 4 块石头且收手」, 即剩余石头数量 d = 4 即 n = 4(1 + c) + a 即 n/4 = 1 + c + a/4 即 n/4 不是整数

所以,「你拿到第 n 块」等价于「n/4 不是整数」

具体代码

var canWinNim = function(n) {
  return n % 4 !== 0
}