Leetcode Tencent 50 Task16 292. Nim Game

描述

你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

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

来源:力扣(LeetCode)
链接:292. Nim Game

解题思路

这道题适合采用归纳演绎法来解。

首先,我们先推演一下 n=1,2,3,4,5,6,7,8,9n=1,2,3,4,5,6,7,8,9时的情况。

1
2
3
4
5
6
7
8
9
10
11
12
n = 1
n = 2
n = 3
n = 4
n = 5 因为 5 = 1 + 4, 胜
n = 6 因为 6 = 2 + 4, 胜
n = 7 因为 7 = 3 + 4, 胜
n = 8 无论你取多少(1~3),接下来的情况是对方面对 5 or 6 or 7 的局面,对方胜

n = 9 因为 9 = 1 + 8, 胜
...

不难发现,只要不是4倍数,在你先手的情况下,都能够得胜!

代码

1
2
3
bool canWinNim(int n){
return n % 4; //如果n不能被4整除 返回True,否则返回false
}