博弈论【sg函数】

SG函数

定义
给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有公平组合游戏的抽象模型。
在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,…yk, 定义SG(x)为x的后继节点y1,y2,…yk的SG函数值构成的集合再执行mex运算的结果,即
SG(x) =mex({SG(y1), SG(y2)…SG(yk)})

mex运算:
mex(N)是集合N中没有出现过的最小自然数。
例如
mex({1,2}) = 0;
mex({0,1,2}) = 3;

-有向图游戏的和
设G1,G2,…Gm 是m个有向图游戏。定义有向图游戏G,它的行动规测总任选某个有向图游戏Gi, 并在G上行动一步行动。G被称为有向图游戏G1,G2,…Gm 的和。有向图游戏的和的SG函数值等于它包含的各个子游戏SG函数值的异或和,即:
SG(G) = SG(G)xor SG(G2) xor … xor SG(Gm)
定理
有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。
**

  1. 在一个没有出边的节点上,棋子不能移动,它的sG值为0,对应必败局面。
  2. 若一个节点的某个后维节点SG值为0.在mex运算后,该节点的sG值大于0.这等价于,若一个局面的后维局面中存在必败局面,则当前局面为必胜局面。
  3. 若一个节点的后维节点SG值均不为0,在mex运算后,该节点的sG值为0.这等价于:若一个局面的后继局面全部为必胜局面,则当前局面为必败局面。

对于若干个有向图游戏的和,其证明方法与NIM博弈类似。
3. [ ] 例题
4. [ ] POJ2311 cutting game
- 问题描述
给定一张N+M的矩形网格纸,两名玩家轮流行动。在每一次行动中,可以任选一张矩形网格纸,沿着菜一行或者某一列的格线,把它剪成两部分。首先剪出1+1的玩家获胜。两名玩家都采取最优策略行动,求先手是否必胜。1≤N,M≤200

  1. 思路
    对于一张N*M的矩形网格纸,我们可以枚举如何行动,把这张纸剪成两部分。这两部分是两个“子剪纸游戏”,二者的SG值执行xor运算,可得到这个行动之后局 面的SG值。

对所有合法行动产生的子局面构成的集合做mex运算,即可得到这张N*M网格纸的SG函数值,从而判断它是否先手必胜。即:
SG(N,M) = mex(Sl(,M)xorSG(N - i,M),其中1≤i<N} U {SG(N,0) xorSG(N,M-I),其中1≤i< M})
SG(I,M)xorSG(N- i,M)为沿着第i行下边的格线剪开,两个子游戏SG值xor的结果。SG(N,I)xor SG(N,M-i)为沿着第i列右边的格线剪开,两个子游戏SG值xor的结果。
U表示集合的并集运算。最后执行mex运算,就得到了SG(N,M)。

  • 代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 210;
int vis[N];
int map[N][N];
int n, m;
int sg(int n, int m){
	if(n == 1 || m == 1) 
		return map[n][m] = 1;
	if(map[n][m] != -1)
		return map[n][m];
	memset(vis, 0, sizeof vis);
	for(int i = 2; i<= n / 2; i++)
		vis[sg(i, m) ^ sg(n - i, m)] = 1;
	for(int i = 2; i <= m / 2; i++)
		vis[sg(n, i) ^ sg(n, m - i)] = 1;
	int i = 0;
	while(true){
		if(!vis[i])
			return map[n][m] = i;	
		i++;
	}
}
int main(){
	memset(map, -1, sizeof map);
	while(~scanf("%d%d", &n, &m)){
		if(sg(n, m))
			cout << "WIN" << endl;
		else cout << "LOSE" << endl;
	}
	return 0;
}
发布了28 篇原创文章 · 获赞 22 · 访问量 1018

猜你喜欢

转载自blog.csdn.net/qq_45432665/article/details/104017491