1、题目
你和你的朋友,两个人一起玩 Nim 游戏:
- 桌子上有一堆石头。
- 你们轮流进行自己的回合, 你作为先手 。
- 每一回合,轮到的人拿掉 1 - 3 块石头。
- 拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n
的情况下赢得游戏。如果可以赢,返回 true
;否则,返回 false
。
示例 1:
输入:n = 4
输出:false
解释:以下是可能的结果: 1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。 2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。 3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。 在所有结果中,你的朋友是赢家。
示例 2:
输入:n = 1
输出:true
示例 3:
输入:n = 2
输出:true
提示:
题目来源:力扣
2、分析
当 n 为0,4,8,12 ......时,A 必定会输,因为不论 A 取多少,B 只要和 A 共同取走 4 即可;
当n不为0,4,8,12......时,A 只需要将 n 取成 4 的倍数,这样就变成了 B 先取,B 一定会输,所以 A 一定会赢。
3、推广
- 巴什博弈(Bash Game)
如果我们推广一下,每次不一定取1、2、3颗,而是取1~m颗,那么我们就可以得到:如果n % ( m +1)=0,即为先手必败状态,否则为先手必胜状态。
4、博弈类题目中的一些概念
(1)ICG
满足以下条件的游戏是ICG(可能不太严谨)︰
- 有两名选手;
- 两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;
- 对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;
- 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。
根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。
(2)N-position / P-position(先手必胜状态 / 必败状态)
如 LeetCode#292.Nim 游戏的分析一样,0,4,8,12....等状态就是对于先手的P-position(必败状态),其他的则是对于先手的N-position (必胜状态)。
那么我们定义两个状态之间的转换:
- ① 无法进行任何移动的局面(也就是terminal position)是P-position。
- ② 可以移动到 必败状态(P-position)的局面是 必胜状态(N-position)。
- ③ 所有移动都导致 必胜状态(N-position)的局面是 必败状态(P-position)
注意事项:
- 这里的先手和题目中的先手没有关系,先手指的是 “ 当前局面要进行操作的叫做先手 ”,其实我们可以认为当前的 执棋人 叫做先手。
- P-position:必败状态,即 Previous-position
- N-position:必胜状态,即 Next-position
- 对 ① 的分析:以 Nim 游戏举例说明
当 n = 0时,我们称这种状态为必败状态,因为这时已经没有石头供他拿了。
- 对 ② 的分析:
问题1:为什么用 可以 修饰?
回答1:这时因为要获胜(对于当前执棋者A而言,此时n!=0)也就是到达 必败状态(取完棋子之后n = 0,这个状态是对于n=0的这个执棋人的),可以取 1,2,3颗石头,可能1不行,但是2,3可能可以达到必败状态。所以用的是可以修饰;
这个可以是对1,2,3而言的,可以是1,可以是2,可以是3
- 对③分析:
当对-1,-2,-3都尝试过后,都是 必胜状态,那当前局面如论如何操作都是 必败状态。
参考文献
[ 1 ] 郑州大学ACM实验室暑假力扣讲题:博弈(Nim游戏与SG函数初探)_哔哩哔哩_bilibili