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;
}

 

posted @ 2012-12-10 23:07  _hikaru__  阅读(257)  评论(0编辑  收藏  举报