LeetCode题解:Nim Game

题目链接:

Nim Game


题目描述:

两个人取一堆石子,每人移走1、2、3块石头,移除最后一个石子的人获胜,把自己作为第一个取石子的人,在游戏中我们总是采取最优策略来取石子,以获得最后的胜利。


题目解释:

由题目描述我们可以得出一下几点:

  1. 用户本身作为第一个取石子的人。
  2. 采取最优策略,也就是说最后的结果是唯一的:要么赢要么输。
  3. 如何取石子已经不重要了。

解题方案:

最开始的时候,我的想法是采用递归的方法遍历所有可能的方案,只要找到一个获胜的,我们就可以断定用户可以赢,但是这种方法效率太慢了,会不会有O(1)时间复杂度的解决方法呢?像这样的题目一般都会有数学规律或者一个公式。我列出了一下情况:

石头数 比赛结果
1———- win
2———–win
3———–win
4———–lost
5———–win
6———–win
7———–win
8———–lost
9———–win
10———win
11———win
12———lost


从上面的规律我们可以发现:4的倍数,用户必输,其他情况用户必赢。
所以这道题我们只要判断石子数是否为4的倍数即可,若为4的倍数,用户必输,其他情况用户必赢


下面来看AC代码(C语言版本):

bool canWinNim(int n) 
{
  if(n % 4 == 0)
  {
      return false;
  }
  return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值