博弈类题型 初涉

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

提示:

  • 1\leqslant n \leqslant 2^{31}-1

题目来源:力扣


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(可能不太严谨)︰

  1. 有两名选手;
  2. 两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;
  3. 对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;
  4. 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。

根据这个定义,很多日常的游戏并非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


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值