292. Nim Game
链接
题意
你在和朋友玩这样一个游戏:桌上有一堆石头,你们每次都能从中移除1到3块石头,谁能移除最后一块石头就能获胜。在给定石头块数和你来先手的情况下,判断你是否可以获胜。
思路
这道题主要是思维上的难度。先从数量最少的考虑:
一块:自己赢
两块:自己赢
三块:自己赢
四块:自己只能移除1-3块,所以对方必赢
五块:
移除一块相当于对方处于上面四块的情况,所以自己赢
移除两块相当于对方处于上面三块的情况,所以对方赢
移除三块相当于对方处于上面两块的情况,所以对方赢
那么换位思考一下,如果是你朋友先手,那你怎么才能保证你必赢呢?通过规律可发现,当石头块数为4的倍数时,后手的人必赢。因为先手的人一次只能移除1-3块,那么后手的人每次保证两个人移除块数和为4就行(比如A先拿1,那么B就拿3),这样可以保证剩余块数也总为4的倍数,到只剩下4块时,可以知道,后手的人必赢。也就是说,只要块数为4的倍数,那么题目中的“you”就必输。
代码
C:
bool canWinNim(int n) {
return n % 4;
}
效率
Your runtime beats 50.44% of c submissions