zoukankan      html  css  js  c++  java
  • hdu 1848 sg博弈模版题

    /*
    计算从1-n范围内的SG值。
    Array(存储可以走的步数,Array[0]表示可以有多少种走法)
    Array[]需要从小到大排序

    1.可选步数为1-m的连续整数,直接取模即可,SG(x) = x % (m+1);
    2.可选步数为任意步,SG(x) = x;
    3.可选步数为一系列不连续的数,用GetSG(计算)
    */

    int SG[MAX], hash[MAX];
    void GetSG(int Array[], int n = MAX-1)
    {
        int i, j;
        memset(SG, 0, sizeof(SG));
        for(i = 0; i <= n; i++)
        {
            memset(hash, 0, sizeof(hash));
            for(j = 1; Array[j]<=i; j++)
                hash[SG[i - Array[j]]] = 1;
            for(j = 0; j <= n; j++)
            {
                if(hash[j] == 0)
                {
                    SG[i] = j;
                    break;
                }
            }
        }
    }

    View Code
    // I'm lanjiangzhou
    //C
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <math.h>
    #include <time.h>
    //C++
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <cctype>
    #include <stack>
    #include <string>
    #include <list>
    #include <queue>
    #include <map>
    #include <vector>
    #include <deque>
    #include <set>
    using namespace std;
    
    //*************************OUTPUT*************************
    #ifdef WIN32
    #define INT64 "%I64d"
    #define UINT64 "%I64u"
    #else
    #define INT64 "%lld"
    #define UINT64 "%llu"
    #endif
    
    //**************************CONSTANT***********************
    #define INF 0x3f3f3f3f
    
    // aply for the memory of the stack
    //#pragma comment (linker, "/STACK:1024000000,1024000000")
    //end
    
    /*const int maxn =1010;
    int k;
    int fibo[maxn],f[maxn];
    int mex(int p){
        int t;
        bool g[110]={0};
        for(int i=0;i<k;i++){
            t=p-fibo[i];
            if(t<0) break;
            if(f[t]==-1) f[t]=mex(t);
            g[f[t]]=1;
        }
        for(int i=0;;i++){
            if(!g[i])
                return i;
        }
    }
    
    int main(){
        int n,m,p,s;
        fibo[0]=1;
        fibo[1]=2;
        for(int i=2;i<=18;i++){
            fibo[i]=fibo[i-1]+fibo[i-2];
        }
        k=19;
        sort(fibo,fibo+k);
        memset(f,0,sizeof(f));
        f[0]=0;
        for(int i=1;i<=1000;i++){
            f[i]=mex(i);
        }
        while(scanf("%d%d%d",&m,&n,&p)!=EOF){
            if(m==0&&n==0&&p==0) break;
            s=0;
            s=s^f[m]^f[n]^f[p];
            if(s==0) {
                printf("Nacci\n");
            }
            else {
                printf("Fibo\n");
            }
        }
        return 0;
    }*/
    
    const int maxn =1010;
    int SG[maxn],hash[maxn];
    int fibs[maxn];
    
    void Fib(){
        fibs[1]=1;
        fibs[2]=2;
        for(int i=3;i<=18;i++){
            fibs[i]=fibs[i-1]+fibs[i-2];
        }
        return;
    }
    
    void GetSG(){
        memset(SG,0,sizeof(SG));
        for(int i=0;i<=maxn;i++){
            memset(hash,0,sizeof(hash));
            for(int j=1;fibs[j]<=i;j++){
                hash[SG[i-fibs[j]]]=1;
            }
            for(int j=0;j<=maxn;j++){
                if(hash[j]==0){
                    SG[i]=j;
                    break;
                }
            }
        }
        return;
    }
    
    
    int main(){
        Fib();
        GetSG();
        int n,m,p;
        while(scanf("%d%d%d",&n,&m,&p)!=EOF){
            if(n==0&&m==0&&p==0) break;
            if(SG[m]^SG[n]^SG[p]){
                printf("Fibo\n");
            }
            else {
                printf("Nacci\n");
            }
        }
    }
  • 相关阅读:
    13自下而上语法分析
    12 递归下降语法分析
    LL(1)文法的判断,递归下降分析程序
    消除左递归
    作业4 .K均值算法--应用
    作业3 K均值算法
    作业2 机器学习相关数学基础
    作业1 机器学习概述
    作业15 语法制导的语义翻译
    作业14:算符优先分析
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/3023303.html
Copyright © 2011-2022 走看看