持续创作,加速成长!这是我参与「掘金日新计划 · 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 块。
假设按如下步骤拿石头:
- 你拿 a 块, a = 1,2,3
- 对手拿 b 块,你拿 4 - b 块,即步骤2总是拿走4块石头
- 重复步骤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
}