码迷,mamicode.com
首页 > 其他好文 > 详细

【博弈论】【SG函数】hdu1848 Fibonacci again and again

时间:2015-03-13 22:02:30      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数。

有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态。

不论SG值增加与否,我们都可以将当前所有子游戏的SG值异或起来从而判断胜负状态。

常采用记忆化搜索来计算SG函数。

#include<cstdio>
#include<set>
#include<cstring>
using namespace std;
int fib[1001],a[3],SG[1001],m;
int sg(int x)
{
	if(SG[x]!=-1) return SG[x];
	set<int>S;
	for(int i=1;i<=m;++i)
	  {
	  	if(fib[i]>x) break;
	    S.insert(sg(x-fib[i]));
	  }
	for(int i=0;;++i)
	  if(S.find(i)==S.end())
	    return SG[x]=i;
}
int main()
{
	fib[1]=fib[2]=1;
	for(m=2;fib[m+1]<=1000;++m)
	  fib[m+1]=fib[m]+fib[m-1];
	memset(SG,-1,sizeof(SG));
	while(1)
	  {
	  	scanf("%d%d%d",&a[0],&a[1],&a[2]);
	  	if((!a[0])&&(!a[1])&&(!a[2]))
	  	  break;
	  	puts((sg(a[0])^sg(a[1])^sg(a[2]))?"Fibo":"Nacci");
	  }
	return 0;
}

【博弈论】【SG函数】hdu1848 Fibonacci again and again

标签:

原文地址:http://www.cnblogs.com/autsky-jadek/p/4335929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!