poj 3537
输入n,有n个格子,两人轮流往里画X,先得到3个连续的X胜,1胜输出1,2胜则输出2。n<=2000
求sg值,可以把游戏分解成i-3和n-i-2两个游戏,再求sg值。
AC代码:
#include<stdio.h> #include<string.h> #define N 2010 int sg[N]; int getsg(int n) { if (n<0) return 0; if (sg[n]!=-1) return sg[n]; int flag[N],i; memset(flag,0,sizeof(flag)); for (i=1;i<=n;++i) { int ans=getsg(n-i-2)^getsg(i-3); flag[ans]=1; } for (i=0;flag[i];++i); sg[n]=i; return i; } int main () { int n; int i,j; memset(sg,-1,sizeof(sg)); sg[0]=0;sg[1]=sg[2]=sg[3]=1; while (scanf("%d",&n)!=EOF) { if (getsg(n)) printf("1\n"); else printf("2\n"); } return 0; }