leetcode_292_Nim Game

两个人在进行游戏——取石子,每次可以取1-3颗石子,给出n个石子,判断第一个人能否获胜……

比如说 如果当前有四颗石子,第一个人无论取多少颗石子都会输,因为第二个人能够取光石子。


仔细思考其实很简单,关键在于 4.

如果大于4颗石子,

第一个取的人第一次取走n/4颗石子

第二个取得人第一次取走k1颗石子(k1=1,2,3)

第一个取得人第二次取走4-k1颗石子

第二个取得人第二次取走k2颗石子(k2=1,2,3)

以此类推,

第一个人必然会赢...

那么可以知道,如果n%4 == 0 那么第一个人才可能输,就是第一个人第一步就进行不下去了,策略就会失败。

class Solution {
public:
    bool canWinNim(int n) {
        if(n%4 == 0)
        return false;
        else
        return true;
    }
};


推广其实这是巴什博弈(Bash Game)。任意给定N个石子,每个人每次可以去小于等于m个石子,第一个人需要怎么取才会成功。

N = (m+1)r+s (前提条件为s不为0)

第一个取石子的人第一次取s = n%(m+1)个

第二个取石子的人第一次取k1个

第一个取石子的人第二次取(m+1)-k1个

第二个取石子的人第二次取k2个

第一个取石子的热第三次取(m+1)-k2个

……

这么做的目的是保证第一个人拿完石子后,剩余的石子数是(m+1)的倍数,那么第一个取石子的人就能获胜。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值