292.Nim游戏
题目
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
示例:
输入: 4 输出: false 解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
思路
根据题目所说,我们每次可以拿1-3块,也就是说假设现在轮到我们的局面只剩1-3块,那我们必赢;但是如果轮到我们局面剩下4块,那我们必输,因为我们不管最后拿多少,肯定会剩下石头,让对手胜出,由此可见,在谁的回合中剩下4块石头,谁必输;另一方面,为了让对手回合有4块石头,我们的回合就一定得是5-7块石头,如果我们的回合有8块石头,那无论我们拿多少个石头,对方都能够逼迫我们下一回合拥有4块石头,所以我们也输了.
也就是说,只要我们的回合是4,8,12,16等等4的倍数块,那对手就总能够逼迫我们剩下四块,导致我们失败;另一方面,只要我们的回合不是4的倍数块,我们就能逼迫对手变成4的倍数块,从而赢得胜利.
代码
1 | public bool CanWinNim(int n) |