HDOJ 1848(SG函数)

对于SG函数来说,sg[y]=x的意义为,x与y的输赢状态是相同的

sg[y]=mex(y)的定义与n.p点的定义是相同的

 

#include<iostream>
#include<cstring>
using namespace std;
int SG[1001],f[20]={1,2};
int flag[20];
void getfibo()
{
    int i;
    for(i=2;i<=15;i++) f[i]=f[i-1]+f[i-2];
}
void getSG(int x)
{
    int i,j;
    memset(SG,0,sizeof(SG));
    for(i=0;i<x;i++)//对i点的SG值进行搜索
    {
        memset(flag,0,sizeof(flag));
        for(j=0;f[j]<=i;j++)//对i点所有后继点的SG值进行标记
        {
            flag[SG[i-f[j]]]=1;
        }//
        for(j=0;;j++)//搜索没有被标记的最小值
        {
            if(flag[j]==0)
            {
                SG[i]=j;
                break;
            }
        }
    }
}
int main()
{
    int m,n,p;
    int t1,t2,t3;
    int ans;
    int i;
    getfibo();
    getSG(1000);
    for(i=0;i<30;i++) cout<<SG[i]<<" ";
    while(cin>>m>>n>>p)
    {
        if(m==0&&n==0&&p==0) break;
        ans=SG[m]^SG[n]^SG[p];
        if(ans==0) cout<<"Nacci"<<endl;
         else cout<<"Fibo"<<endl;
    }
    return 0;
}

posted @ 2013-12-21 12:33  ACalvin  阅读(172)  评论(0编辑  收藏  举报