Nim Game,其实很多人都玩过。其实就是我们玩的划线游戏。
一张纸上,画若干条线,双方一人划一次,每次划掉1~3条线。可以选择画1条,也可以划2条,也可以3条。具体划去几条线完全看自己的策略。谁划掉最后一条线,就是赢家。
如上图,蓝方获胜。
正在看这篇文章的你一定是一个聪明人,每一步都是最优解,而你的对手,也跟你一样聪明,每步都是最优的解法。
现在你作为先手,在线条总数为多少的时候,你必赢呢,又在多少的时候必输呢?
可不可以用一个函数来判断在线条总是为x时你的输赢情况呢?这样你以后跟别人玩这个游戏的时候就不会输啦。
答案是可以,不过我们要先来分析一下这个问题。
在线的总是为多少的时候一定会输呢。
每人每步最多划三条线,所以线的总是至少为4条。当线的总数为4条的时候,不管先手划几条线,后手都有应对的方法,先手必输。
所以你会发现8条也是必输,8条线可以分成两个部分,每个部分四条线。自然先手还是必输。4这个数字还真是不太吉利。
当线的总数为5条的时候,先手先划掉一条线,后手就等于是在4条线的情况下先手,自然后手输。
而6条 7条 先手都可以划掉2条线和3条线来让后手落入“4”的陷阱。
所以我们可以看出,我们只要远离”4“就行了。当线的总数不是4的倍数的时候,先手必赢。
看到这里,恭喜你掌握了必胜法则,下次各位盆宇就可以用这个游戏跟别人打赌了。
所以现在我们可以将我们的结论写到代码里了。
在这里我将实现一个C语言的函数:
bool canWin(int n) {
return n%4;
}
参数 n 代表的是线条的总数。 通过线条总是是否能被4整除来判断这场比赛中作为先手的你必赢还是必输。
当 n%4 的结果为0时意味着n能被4整除,返回0,转换为布尔值为false。
当n%4不等于0时意味这n不能被4整除,返回非0,转换为布尔值为true。
好了,下次玩这个游戏你就知道该怎么玩了吧。(手动斜眼)