LeetCode-Day26 (C#) 292. Nim 游戏

先说结论:作为先手,如果堆中石头的数量 n 不能被 4 整除,那么你总是可以赢得 Nim 游戏的胜利。

原因:1.小于3块的话,你作为先手就可以全拿走,结束游戏。

2.如果刚好4块的话,作为先手一定会输,因为对手一定会拿走最后一块。所以在自己的回合中应避免自己剩下4个。

3.但是如果不是4倍数的话,就可以控制将4个留给对手,那么自己必定会赢。比如7,那就先把后四个排除,剩下3个,自己都拿走,就将四个僵局留给对手。比如13,将3*4剪掉,第一次自己拿走1个,后几轮对手不管哪几个,你都可以和他配对成4个,然后把最后4个留给他。

4.如果刚好是4的倍数,比如8,对方很容易将4的僵局留给你,将后面四个先排除,前四个你作为先手不管拿1-3几个,对面都可以和你加起来等于4,从而把后四个留给你。

所以把n除以4,如果整除,那就必定会输。相反,总会赢。

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

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

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

示例 1:

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

示例 2:

输入:n = 1
输出:true

示例 3:

输入:n = 2
输出:true

提示:

  • 1 <= n <= 2^31 - 1
public class Solution {
    public bool CanWinNim(int n) {
        return n % 4 != 0;
    }
}

你可能感兴趣的:(LeetCode-Day26 (C#) 292. Nim 游戏)