Crosses and Crosses poj-3537
题目大意:给定一个1*n的网格,每次往格子内填一个$ imes$,连续的三个即可获胜。
注释:$1le nle 2000$。
想法:我们先尝试往里面填一个$ imes$。
我们发现对于先手和后手来讲,与那个$ imes$相邻的格子都不能动。
所以就相当于整个游戏被分成了3个游戏,中间的是一个$ imes$和两个空格。
发现中间的游戏先手必败,故中间的游戏的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"); } }
小结:好题啊??!