Crosses and Crosses poj-3537
题目大意:给定一个1*n的网格,每次往格子内填一个$\times$,连续的三个即可获胜。
注释:$1\le n\le 2000$。
想法:我们先尝试往里面填一个$\times$。
我们发现对于先手和后手来讲,与那个$\times$相邻的格子都不能动。
所以就相当于整个游戏被分成了3个游戏,中间的是一个$\times$和两个空格。
发现中间的游戏先手必败,故中间的游戏的SG为0。
即:只需要求左右的SG值,爆搜即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sg[2100];
int dfs(int n)
{
if(n<0) return 0;//n<0
if(sg[n]>=0) return sg[n];
bool g[2001]={0};
for(int i=1;i<=n;i++)
{
int t=dfs(i-3)^dfs(n-i-2);
g[t]=1;
}
for(int i=0;;i++)
if(g[i]==0) return sg[n]=i;
}
int main()
{
memset(sg,-1,sizeof(sg));
int n;
while(scanf("%d",&n)!=EOF)
{
if(dfs(n)) puts("1");
else puts("2");
}
}
小结:好题啊??!