SG
SG函数
NIM博弈
概述:有
定理:
即
扩展:
1.
先手必胜条件:将每一堆石子个数进行二进制分解,统计二进制位上每一位的1的个数(将每个数二进制第i位相加),再对每一位分别
2.反
先手必胜条件:当每堆石子都只有1个,且异或和为0,或者至少有一堆石子超过1个,且异或和不为0时,先手必胜
3.阶梯博弈:有n层阶梯(地面为第0层),每一层上有若干个石子,每一次操作可以将一个阶梯上的石子往下推,推到0层就消失,二人轮流操作,没石子推者输
该问题等价于将所有奇数阶梯上的石子做
公平组合游戏ICG(Impartial Combinatorial Games)
若一个游戏满足:
1.双方轮流操作
2.在游戏进程中的任意时刻,双方可选择的操作与轮到哪位玩家无关
3.不能行动者判负
则称这个游戏为公平组合游戏
nim游戏便是一个典型的ICG,但常见的棋类游戏如围棋便不是,因为不满足2,3
有向图游戏DG(Digraph game)
给定一个有向无环图,只有唯一的一个起点,其上有一枚棋子,两名玩家可以轮流将棋子向其中一条有向边进行移动一步,无法行动者判负,则称该游戏为有向图游戏
任意一个ICG都可以转换为有向图游戏,具体方法是:将每一个局面看作有向图中的一个点,将一个局面可以通过合法操作到达的下一个局面连有向边
mex运算
设
SG函数
在有向图游戏中,设从节点
通俗的讲,
特别的,我们定义一个有向图游戏的
有向图游戏的和
给定
定义它的
简单的说就是有向图游戏的
定理
1.有向图游戏某个局面必败,当且仅当这个局面的
2.有向图游戏某个局面必胜,当且仅当这个局面的
例题:
魔法珠(https://www.acwing.com/problem/content/description/237/)
为了展示新学的魔法,他们决定进行一场对弈。
起初
·选择
·施展魔法把这一堆魔法珠变成
·选择这
注意一次操作过后,魔法珠的堆数会增加
当轮到某人操作时,如果每堆中魔法珠的数量均为
请你预测一下,谁能获胜呢?
分析,容易证明这是一个公平组合游戏,于是我们可以考虑使用
下面我们从两个层面来分析这个问题
1.这是个怎样的有向图游戏
2.这个有向图游戏的有向边(也即策略)是什么
经过缜密思考不难发现,整个有向图游戏就是一堆魔法珠,而所对应的子有向图游戏就是每一堆分成的若干堆魔法珠,子有向图游戏所连接的有向边便是删去任意一堆的操作。于是我们设
使用记忆化搜索实现(一般SG函数都用记忆化搜索)
#define int long long
int sg[1005],a[105];
int SG(int x){
if(sg[x]!=-1)return sg[x];
if(x==1)return 0;
sg[x]=0;//必须放在这里!
int t=sqrt(x),tot=0;
int vis[1005],ys[1005];
memset(vis,0,sizeof vis);
for(int j=1;j<=t;j++){
if(x%j==0){
ys[++tot]=j;
if(j*j!=x)ys[++tot]=x/j;
}
}
int ans=0;
for(int i=1;i<=tot;i++)ans^=SG(ys[i]);
for(int i=1;i<=tot;i++)vis[ans^SG(ys[i])]=1;
while(vis[sg[x]])sg[x]++;
return sg[x];
}
signed main(){
int n;memset(sg,-1,sizeof sg);
while(~scanf("%lld",&n)){
int ans=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)ans^=SG(a[i]);
if(ans)puts("freda");
else puts("rainbow");
}
return 0;
}
总结:在使用SG函数求解博弈论问题的过程中,我们应该认真分析,分清楚哪个是最终的有向图游戏,哪些是子有向图游戏,哪些是有向图游戏连接的边,方法是最终题目给的问题一般是最终有向图游戏,它的形式可能于子有向图游戏不一样,子有向图游戏就是操作过程中发生的类似递归似相同结构的问题操作,而有向图游戏连接的边一般为父有向图游戏到子有向图游戏进行的操作
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战