关闭

sg(Sprague-Grundy)函数 小结

标签: algorithm博弈
691人阅读 评论(0) 收藏 举报
分类:
sg(Sprague-Grundy)函数
sg值:一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数。
后继点:也就是按照题目要求的走法,能够走一步达到的那个点。

sg函数值的性质:
sg(x)==0 必败点
sg(x)>0 必胜点

求单个sg函数值

int sg[MAXN];
int get_sg(int x, int n){
	if(sg[x]!=-1)
		return sg[x];
	bool vis[105]={0};
	for(int i=0;i<n;++i){
		int tmp = a[i]; //tmp是转移的下一个状态的步数
		if(x >= tmp){
			sg[x - tmp] = get_sg(x - tmp, n);
			vis[sg[x - tmp]] = 1;
		}
	}
	for(int i=0;;++i)
		if(!vis[i]) return sg[x]=i;
}
void init(){
	memset(sg,-1,sizeof(sg));
	sg[0]=0;
}

预处理sg值

void get_sg(){
	sg[0]=0;
	for(int i=1;i<N;++i){
		set<int> s;
		for(int j=0;j<10;++j){
			int tmp=(1<<j); //tmp是转移的下一个状态的步数
			if(i >= tmp)
				s.insert(sg[i - tmp]);
		}
		int g=0;
		while(s.count(g)!=0) ++g;
		sg[i]=g;
	}
}

例子:
hdu 1847
题意:
1. 总共n张牌;
2. 双方轮流抓牌;
3. 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
4. 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
假设Kiki和Cici都是足够聪明,并且每次都是Kiki先抓牌,请问谁能赢呢?
限制:
1 <= n <= 1000
思路:
sg函数

/*hdu 1847
  题意:
  1. 总共n张牌;
  2. 双方轮流抓牌;
  3. 每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)
  4. 抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;
  假设Kiki和Cici都是足够聪明,并且每次都是Kiki先抓牌,请问谁能赢呢?
  限制:
  1 <= n <= 1000
  思路:
  sg函数
 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int N=1005;
const int M=105;
int sg[N];

/*int get_sg(int x){
	if(sg[x]!=-1)
		return sg[x];
	bool vis[M];
	memset(vis,0,sizeof(vis));

	for(int i=0;i<10;++i){
		int tmp = (1<<i);
		if(x >= tmp){
			sg[x - tmp] = get_sg(x - tmp);
			vis[sg[x - tmp]] = 1;
		}
	}
	for(int i=0;;++i)
		if(!vis[i]) return i;
}
void get_sg(){
	sg[0]=0;
	for(int i=1;i<=1000;++i){
		sg[i]=get_sg(i);
	}
}*/

void get_sg(){
	sg[0]=0;
	for(int i=1;i<N;++i){
		set<int> s;
		for(int j=0;j<10;++j){
			int tmp=(1<<j);
			if(i >= tmp)
				s.insert(sg[i - tmp]);
		}
		int g=0;
		while(s.count(g)!=0) ++g;
		sg[i]=g;
	}
}

void init(){
	memset(sg,-1,sizeof(sg));
}

int main(){
	init();
	
	get_sg();

	int n;
	while(scanf("%d",&n)!=EOF){
		if(sg[n]==0)
			puts("Cici");
		else
			puts("Kiki");
	}
	return 0;
}


0
0
查看评论

SG定理

初始问题 给定NN堆石子,每堆有AiA_{i}个石子。两个人轮流操作,每轮可以选一堆石子来取石子,可以取完,但不能不取。无法操作者输。问先手是否必胜。 SG定理 相信很多人都已经知道了这个定理。 假设现在有一个有向无环的游戏图G(V,E)G(V,E),若(i,j)∈E(i,j) \in E则...
  • PhilipsWeng
  • PhilipsWeng
  • 2015-09-13 18:52
  • 1742

博弈论 SG函数

别被文章长度吓到,学会博弈(SG)只用看前1/10。 鉴于讲明白博弈要写好多字,于是找了些论文拼凑,对疑难点加了注释并配上“美图”助解。 Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor...
  • strangedbly
  • strangedbly
  • 2016-04-12 21:36
  • 7538

博弈sg函数

sg函数(个人认为还是用于三种方法都无法解决的情况,如按特殊数字取石子) 我们把整个博弈过程抽象为有向无环图 1.      几项准备工作: mex求最小非负整数mex{} = 0,mex{0,1,2,4} = 3,mex{1,2,4} =...
  • qq_30241305
  • qq_30241305
  • 2016-03-07 15:36
  • 1165

组合游戏 - SG函数和SG定理

组合游戏的和通常是很复杂的,所以我们介绍一种新工具,可以使组合问题变得简单————SG函数和SG定理。 Sprague-Grundy定理(SG定理):         游戏和的SG函数等于各个游戏SG函数的Nim和。这样就可以将每...
  • luomingjun12315
  • luomingjun12315
  • 2015-05-07 08:09
  • 8112

博弈之SG函数(详解为什么异或可以得出结果)

给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有Impartial Combinatorial Games的抽象模型。 也就是说,任何一个ICG都可以通过把每个局面看成一个顶点,对每个局面和...
  • hndu__lz
  • hndu__lz
  • 2017-03-13 20:40
  • 525

博弈论 SG函数从懵逼到入门 SG模板 hdu1848

 摘自piaocoder的博客: 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。 对于一个给定的有向无环图,定义关于图的每个顶点...
  • yizhangbiao
  • yizhangbiao
  • 2016-07-22 10:03
  • 1390

博弈 SG函数

为什么要学习这个呢?因为每次看到题解的第一句话总是这种的: 水题,简单题,模板题,打表题 然后,第二句话,就是结论,比如sg【x】等于(然后一个分类),就得到了公式 最后就是把所有的亦或起来,就得到了答案了 首先呢,可以把这个题做一做,是一个很好的博弈题。题目链接:HDOJ5754 HDOJ57...
  • kevin66654
  • kevin66654
  • 2016-08-10 17:11
  • 387

对于SG函数的理解

首先是NIM游戏,N堆石子,两个人轮流拿,可以拿一堆或者一堆中的一部分。最后谁不能操作
  • corncsd
  • corncsd
  • 2014-07-06 18:58
  • 3836

SG函数的详细解释

SG函数可以说是博弈论中很重要的运用,有了SG函数就可以解决很多很难解决的博弈问题,也是解决例如nim博弈和翻硬币博弈的一些基础。 入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人;      (2) 道具:2...
  • beyhhhh
  • beyhhhh
  • 2015-07-14 20:38
  • 547

SG函数模板

首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。 对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=me...
  • shankeliupo
  • shankeliupo
  • 2013-10-28 22:19
  • 1296
    个人资料
    • 访问:156589次
    • 积分:3608
    • 等级:
    • 排名:第10786名
    • 原创:213篇
    • 转载:3篇
    • 译文:0篇
    • 评论:43条
    最新评论