292 Nim Game

原题如下:![这里写图片描述](https://img-blog.csdn.net/20151117144013824)

分析:这题有点像小学数学报玩过的一个趣味数学题。首先我们这样来考虑,对于给定的n,如果我想要拿到n必须得拿到n-4(因为每个人只能拿【1,3】个石头),同理可得要想拿到n-4必须得拿到n-8,这其实就是一个递归了。然后我们考虑中止情况,n为1到3的时候肯定是我赢,n为4的时候肯定是对手赢。由此可把n递归到【1,4】内来求解,可得代码如下:

bool canWinNim(int n) {
    if (n <= 3)
        return true;
    if (n == 4)
        return false;
    return canWinNim(n-4);
}

可是当我提交之后并没有通过,提示Last executed input : 1348820612。造成这个结果只要是因为一方面没有考虑到大整数的情况,int型变量可表示的最大正整数为65535。另一方面是由于递归的o(N)时间复杂度造成的。事实上当n取20000的时候编译器就调用不动了。
于是,通过递归的思路我们可以发现,当n为4的倍数时,必输,其余情况必赢。可得代码如下。

 bool canWinNim(int n){
      if(n % 4 == 0)
          return false;
      return true;
 }

简洁明了,时间复杂度为o(1)。总结下来就是分析真的很重要,要透过现象看本质,递归用来找思路不错,真的要是写代码的话还是得慎用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值