平等博弈问题的基本模型:一个状态 DAG 上的移动。
解决博弈论的重要方法:打表。
博弈论问题一般有一些方向:
Ferguson Game
两堆石子,每次可以清空一堆,拆另一堆为两堆,无法操作者输。
分两堆奇偶性画出状态转移,发现两奇必败,其他必胜。
Chomp Game
网格,每次拿走一个点右上的所有数,删除 的人输。
这题有一个非构造性的巧妙判断方法:考虑第一次无论怎么操作都会删掉右上角,所以先手拿掉右上角,如果后手此时必胜,则先手第一步学习后手的必胜策略即可。
所以 时后手必胜,否则先手必胜。
Bash Game
个石子,一次拿 个,无法操作的人输。
这题有两种分析方法:
第一种,考虑状态间的转移,考虑最后的必败状态是 ,也是 。考虑如果 ,先手一定可以把它变成 ,同理,如果一开始 ,那么操作过后一定 ,由于石子数一定在减小,所以总有一个时候 时失败。
这样得出先手必胜条件为 。这是一种十分常规的分析方法,考虑用合理的状态刻画先后手之间的互相转化,最后走到终点。
但是感觉这样设计状态有些唐突,我们考虑第二种,从终点开始, 是必败态。容易得到 是必胜态,因为一定可以一步取完。再推,发现 是必败态,因为后继状态全部必胜;同理又发现 是必胜态,因为可以转化到 。
这里得出了 SG 函数的一个弱化结论(十分显然):如果一个状态的后继状态中存在必败态,那么这个状态就是必胜态;否则为必败态。
这个结论有一个练习题:过河卒(作者省选的遗憾)。
SG 定理
我们定义 DAG 上一个节点的 SG 函数:
其中无出度的点(必败)的 值为 。
函数的性质就是先手必胜当且仅当 函数大于 。
有以下定理:
对于一个由多个不干扰的平行游戏组成的博弈,整体的 SG 函数值为子游戏 SG 值的异或和。
Nim Game
堆石子,第 堆有 个,可以选取一堆并且拿走任意个石子(非 ),无法操作者输。
考虑用 函数分析,如果列出 这些点代表石子个数,我们发现这些点构成一张竞赛图,其中大的连向小的。
不难归纳证明 。
根据以上定理,我们发现这个游戏先手必胜当且仅当所有堆的异或和大于 。
如果要具体分析的话,就是先手先操作使得异或和等于 ,后手一次操作一定让它变得大于 ,先手存在操作将异或和重新变回 (取最大的一堆),这样操作最后到 时一定轮到后手。
Lasker’s Nim Game
Nim 游戏,但是可以选择这一步分裂石子堆。
与新局面取 就好了,由于是两堆并列,所以新局面是 。
打表发现:
, 。
k-nim Game
堆石子,每堆有 个,每次可以选 堆拿,无法操作者输。
考虑如果 ,那么就是一个 Bash Game。
考虑定义状态为对于所有堆,每一个二进制位 的个数都是 的倍数。当前操作者一次操作一定会让某些位 的个数不是 的倍数。由简单 nim 游戏我们可以发现,一定可以通过操作一个数改变某一位的值;同样地,操作最大的数可以改变所有位的值。由于每次操作不超过 个数,所以一个二进制位上可以改变不超过 个 ,所以如果当前某些位不是 倍数,那么一定可以变成 的倍数。
所以类似地,这个游戏的结论就是先手必胜当且仅当某一位二进制 的个数不是 的倍数。
Anti-nim
nim 游戏,但是不能操作者胜。
考虑如果全部都是 ,那么偶数时先手胜,奇数时后手胜。
如果只有 堆 ,那么先手可以决定取不取完,必胜;注意到这种情况所有堆异或和 。
如果有很多堆 ,且所有堆异或和 ,那么先手可以操作一次使异或和 ,此时一定不会出现上面的情况,后手操作一次后异或和一定重新 ,总有一次会变成上面的情况,先手必胜。
反之,如果有多堆 且所有堆异或和 ,先手必败。
一些奇妙的转化
棋盘游戏
的棋盘和 个棋子,每次可以操作一个棋子向左下对角线方向,左边,下面移动任意格,一个棋子移到 就获胜。
这个和以往的博弈不同,一个到达就获胜,不能直接 函数,考虑转化。
容易发现当前行动的这个人不会走到 ,不然直接送掉。所以可以假设 是棋子的终点,当所有棋子到达时,对手就被迫走上面三步,你就赢了。
所以把 当作终点推 即可。
Crosses and Crosses
一张 空纸条,可以涂黑一格,涂黑后连续三个黑就赢。
。
考虑涂黑一格后,左右延伸两格范围内都不能再涂,所以转化为左右两段的子问题, 函数递推即可。
翻硬币游戏
一排 个硬币, 个朝上,每次选择区间并将所有硬币翻面,要求右端点的硬币一定朝上,无法操作者输。
。
翻硬币游戏的统一结论:这些硬币可以看作很多只有一个硬币的子问题的组合, 函数直接异或。
关于这个的感性证明就是考虑翻完最高位,并且同时将低位的很多硬币都翻转,相当于这些子问题的异或,如果某个低位本来就有朝上的硬币,那么会被抵消,同时异或运算也可以抵消,所以 函数不被影响。
K 倍动态减法游戏
个石子,第一个人拿 个,后面每个人拿的都不能超过前面一个人的 倍,不能操作者输。
:先手必胜当且仅当 ,因为先手每次取 ,然后后手必须取更低的,会制造新的 ,而只有先手的操作会让 的个数减少,所以最后拿完的一定是先手,必胜。
如果是 ,那么先手拿完后会变成多个 ,后手采用相同策略。
:先手必胜当且仅当 。考虑一个正整数一定可以拆分成若干个不相邻的 Fibonacci 数的和。有一个特征就是 ,所以我们就可以每次拿 Fibonacci 拆分中最低位,类比二进制计算。
最后通解也就可以构造:我们需要构造数列 使得任意一个正整数可以表示成若干个 的和并且这种表示中相邻两项相差至少 倍。
设 ,我们记数列 为 可以表示出的最大范围,接下来这样构造:
。
是满足 的最大的 ,由于 前面表示不出,所以这一项一定要能表示这个数; 是因为选了 后下一项需要小于等于 。
这样,策略就是取最小表示中最低的位来获得胜利,如果 是序列中的数的话就必败。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App