Game Theory
Nim游戏和sg函数
题意
给出n堆石子,每堆石子的数量为a[i],两个人轮流拿石子,每个人可以挑选任意一堆并拿任意颗石子(不能不拿),轮到谁时没有石子算输,问最后谁获胜
分析
结论:若a[1]^a[2]^a[3]........^a[n]=0,则先手必输,反之先手赢
证明:Nim游戏的证明需引出sg函数
status:状态
P-status:在当前局面下,先手必败
N-status:在当前局面下,先手必赢
不难想出有如下性质:
1.集合为空时的局面为P-status
2.如果某个状态可以移动为P-status,那么这个状态一定为N-status
3.如果某个状态都只能移动到N-status,那么这个状态一定为P-status
回到Nim游戏,我们知道最终状态a[]={0,0,.....0}的局面为P-status,那么可以从终态出发逆推楚所有可能的局面,总共的转态数量为:a[1]×a[2]×....×a[n],考虑记忆化搜索即可得出每个状态的情况
考虑将每个局面看做一个顶点,每个局面的子局面之间有一条有向边,则这个游戏可以转化为一个DAG
定义:mex运算,对于集合运算来说,表示最小的不属于这个集合的非负整数
对于一个Nim游戏,定义:sg函数:sg[x]=mex { sg[y] | x可以移动到达y }
例如:
取石子问题,有 1 堆 n 个的石子,每次只能取 ,1,3,4 个石子,先取完石子者胜利,那么各个数的 SG 值为多少?
可以递推出1~n每个点的sg值
最后若g[n]=0,则先手输,反之后手赢
为什么可以这样做?这样做为什么是正确的呢?
证明:
考虑sg值得含义,每个sg值代表一个状态
如果sg=0,表示当前为p状态,因为mex操作中都是>0,即移动将必定将对手的状态变为必胜态
sg≠0,表示通过几次操作可以变为p状态(即当前为N状态),因为N转态可以一步到达P状态,而p状态的当前选手必输
考虑sg函数和Nim函数,当sg[x]=k,表示x状态可一步转移到0~k-1,故Nim游戏中,每一堆石子相当于一个sg值,最终所有堆的sg即为所有子堆得sg值得xor异或
求解sg值得方法可以 直接递推/DFS 求解
Bash Game
题意
只有一堆 n 个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取 m 个。最后取光者得胜
分析
这个游戏的策略是想办法留个对手(m+1)*k个石子
考虑sg函数的话,显然是可解决的
Wythoff Game
题意
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜
分析
黄金分割理论
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程