Crosses and Crosses POJ 3537 SG
一个普通的打表SG 函数题目。算是结尾博弈这一章的学习吧! 博弈前后做了两个星期了吧,刷了两套题,但是还是有好多不懂,对于 NIM积,还有一些高阶 的删边 问题,甚至 SG 打表找规律 也会有时候做不出来,下次博弈的训练还有好多要学~~~~~~
题意: 给你一行格子,每次两个人依次向格子里面填 'x',出现三个连续的 'x' 的时候就 win;
思路:Multi_SG 游戏 点击打开链接 点击打开链接 点击打开链接
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#define maxn 10010
bool vis[maxn];
int sg[maxn];
void init()
{
sg[0]=0;
sg[1]=1;
sg[2]=1;
sg[3]=1;
sg[4]=2;
sg[5]=2;
for(int i=6;i<=2000;i++)
{
memset(vis,0,sizeof vis);
vis[sg[i-3]]=vis[sg[i-4]]=vis[sg[i-5]]=true;
for(int j=1;j<=i-j-5;j++)
{
vis[sg[j]^sg[i-j-5]]=1;
}
for(int k=0;;k++)
if(!vis[k])
{
sg[i]=k;
break;
}
}
}
int main()
{
init();
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",sg[n]?1:2);
}
return 0;
}