两个人在进行游戏——取石子,每次可以取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)的倍数,那么第一个取石子的人就能获胜。