潘老师镇楼

在很久很久以前,有这样一个广为流传的小游戏:
给定
这其实就是著名的采石子游戏。
由此引来第一个知识点:
NIM 博弈
在 NIM 博弈中,把游戏过程中面临的状态称为局面。整局游戏中第一个行动的称为先手,第二个行动的称为后手。若在某一局面下存在某种行动,都会输掉游戏,则称该局面必败。所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对手面临必败局面,则优先采取该行动。同时,这样的局面被称为必胜。我们讨论的博弈问题一般都只考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。NIM 博弈不存在平局,只有先手必胜和先手必败两种情况。
定理
NIM 博弈先手必胜,当且仅当
证明:
所有物品被取光是一个必败局面(对手取走最后一件物品,已经获得胜利),此时显然有
对于任意一个局面,如果
对于任意一个局面,如果
然后用数学归纳法就出来了。
公平组合游戏 ICG
若一个游戏满足:
- 有两名玩家交替行动。
- 在游戏进程的任意时刻,可以执行的合法运动与轮到哪名玩家无关。
- 不能行动的玩家判负。
则称该游戏为一个公平组合游戏。
NIM 博弈属于公平组合游戏。
有向图游戏
给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都可以转化为有向图游戏。方法:把每个局面看成图中一个节点,并且从每个局面沿着合法行动能够到达的下一个局面连有向边。
Mex运算
设
SG函数
在有向图游戏中,对于每个节点
特别地,整个有向图游戏
有向图游戏的和
设
有向图游戏的和的
定理
有向图的某个局面必胜,当且仅当该局面对应节点的
有向图的某个局面必败,当且仅当该局面对应节点的
例题:取石子游戏
有一堆
以此类推……
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 1 | 2 | 3 | 2 | 0 | 1 |
由上述实例我们就可以得到
1、使用数组
2、然后我们使用另一个数组将当前状态
3、最后模拟 mex 运算,也就是我们在标记值中搜索未被标记值的最小值,将其赋值给
4、我们不断的重复
//f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理
//SG[]:0~n的SG函数值
//S[]:为x后继状态的集合
int f[N],SG[MAXN],S[MAXN];
void getSG(int n){
int i,j;
memset(SG,0,sizeof(SG));
//因为SG[0]始终等于0,所以i从1开始
for(i = 1; i <= n; i++){
//每一次都要将上一状态 的 后继集合 重置
memset(S,0,sizeof(S));
for(j = 0; f[j] <= i && j <= N; j++)
S[SG[i-f[j]]] = 1; //将后继状态的SG函数值进行标记
for(j = 0;; j++) if(!S[j]){ //查询当前后继状态SG值中最小的非零值
SG[i] = j;
break;
}
}
}