X-man

导航

hdu 3032 Nim or not Nim?(搜索打SG表)

题意:

  有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,

也可以选择将这堆石子分成任意的两堆。alice与bob轮流取,取走最后一个石子的人胜利。

思路:

  因为数的范围比较大,所以最好通过SG打表的结果找出规律在解。

打表代码

#include<cstdio>
#include<cstring>
int sg[10000];
int find(int x)
{
    if(sg[x]>=0) return sg[x];
    bool mex[10000]= {0};
    for(int i=0; i<x; i++)
    {
        mex[find(i)]=1;//
        if(x-i>0&&i>0) mex[find(i)^find(x-i)]=1;
    }
    int i=0;
    while(mex[i]) i++;
    return sg[x]=i;
}
int main()
{
    int n;
    memset(sg,-1,sizeof(sg));//sg[0]=0;
    //printf("%d#",sg[0]);
    find(100);
    for(int i=0; i<=100; i++) printf("%d %d\n",i,sg[i]);
    return 0;
}

提交代码:

#include<stdio.h>
int x[4]={-1,0,0,1};
int main()
{
    int _case,n,m,ans;
    scanf("%d",&_case);
    while(_case--)
    {
        ans=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&m);
            ans^=m+x[m%4];
        }
        if(ans)printf("Alice\n");
        else printf("Bob\n");
    }
}

 

 

 

posted on 2013-10-02 13:37  雨钝风轻  阅读(250)  评论(0编辑  收藏  举报