(本文为自学笔记,如有错误敬请指正)
如今有100个石子,AB两个玩家每次分别可以取走1到7个石子,谁拿走最后一个石子则获胜。
算法概述:
用100对8取余数,如果余数为零则先手必败,不为零则先手必胜。
推理:
这个推理有点像走楼梯问题,一次最多可以上两层,那么上到最后一层时,有可能是一步上来,也有可能是两步上来。
对于本题,我们可以发现有一种情况我们必胜:对方剩下8个石子。
对于8这个数字,只要对方取走,便可以剩下我们可以一次取完的数量,并且对方无法一次取完8个石子。
这样考虑是将整个过程分成了”最后剩8个石子”和”之前部分”,我们下来要处理的事情就是如何对”之前部分”操作使得刚好剩下八个石子。
同样的方式考虑,对于剩下的92个石子,如果我们可以拿到第92个石子即满足情况。
!!!这时候我们发现,这个问题和刚才处理的大同小异,只是数字不一样而已。于是我们把8作为一个周期,用100对8取余,得到数字4。意味着我们如果第一次取走4个石子,对方将面对12个’8组情况‘,他必败。
反过来说,如果石子的总数除以8没有余数,意味着我们将面对八组情况,如果对手懂得巴什博弈的话,我们就要输了!
抽象化:
可以看到,这个关键的组数,是一次可以最多选择的石子数加一。
于是就有了开头的计算公式。
参考资料:
1.熊熊的小心心,算法导论专栏,CSDN