难度简单
你和你的朋友,两个人一起玩 Nim 游戏:
- 桌子上有一堆石头。
- 你们轮流进行自己的回合,你作为先手。
- 每一回合,轮到的人拿掉 1 - 3 块石头。
- 拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n
的情况下赢得游戏。如果可以赢,返回 true
;否则,返回 false
。
示例 1:
输入:n = 4
输出:false
解释:如果堆中有 4 块石头,那么你永远不会赢得比赛;
因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
示例 2:
输入:n = 1
输出:true
示例 3:
输入:n = 2
输出:true
巴什博奕,n%(m+1)!=0时,先手总是会赢的。
分析:
先说结论:作为先手,如果堆中石头的数量 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,如果整除,那就必定会输。相反,总会赢。
class Solution {
public boolean canWinNim(int n) {
if(n % 4 != 0)
return true;
else
return false;
}
}