leetcode 292. Nim Game

257 篇文章 17 订阅

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.

Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.

For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.

这一题就是,发现了其中的数学奥妙的人一行就解决了,妄想用程序做出来的人,就stackoverflow了。。。我原来想着用递归,结果栈溢出了。好吧,看看他们的理论。

  1. 基础情况: 当 n = 4时,无论first player拿走几个石子,second player都会拿走剩下的石子,输。

  2. 当 1* 4 < n < 2 * 4, (n = 5, 6, 7), first player可以在第一次拿的时候,做到留给second player 4个石子,所以赢。所以5,6,7就是winning numbers ,当一个玩家得到winning numbers时,他就能赢。

  3. 现在开始下一个循环,n = 8, 无论first player拿几个石子, 都会让second player拿到winning numbers (5, 6, 7) . 所以, 8 % 4 == 0, 又是一个死亡数字.

  4. 对于在8~12之间的数字,  9, 10, 11, 都是对first player来说的 winning numbers , 因为first player能做到留给second player死亡数字8.

遵循这个规律,能被4整除的数字对于first player来说就是死亡数字。而不被4整除的数字,first player能够把死亡数字留给second player,所以能赢。

public boolean canWinNim(int n) {    
    return n % 4 != 0 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值