• hihocoder博弈游戏·Nim游戏·三


          在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但并不取走石子。比如说有一堆石子为k个,当Alice或者Bob行动时,可以将这一堆石子分成两堆,分别为x,y。满足x+y=k,x,y>0。那么增加了这一条规则后,在Alice总先手的情况下,请你根据石子堆的情况判断是Alice会获胜还是Bob会获胜?

         对 于 每 个 堆 可以变成 0-(k-1) 或者 1(k-1)。。。(k-1) 1  SG(K)=mex{ SG( 0 ) , SG(i) ,SG(i)^SG(k-i)... };

      

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    const int maxn = 20005;
    int SG[maxn];
    int use[maxn];
    int main()
    {
         int N;
         SG[0]=0;SG[1]=1;
         for(int i=2; i<=20000; i++)
         {
             use[0]=i;
             for(int k=1; k<=i-1; k++)
             {
                 use[ SG[ k ] ] = i;
                 use[  SG[ k ] ^ SG[ i -  k ] ]=i;
             }
    
             for(int k=1; ; k++)
                {
                    if(use[k]!=i){
                         SG[i]=k; break;
                    }
                }
         }
         while(scanf("%d",&N)==1)
         {
             int ans=0;
             for(int i=0; i<N; i++)
             {
                 int a;
                 scanf("%d",&a);
                 ans^=SG[a];
             }
             if(ans)puts("Alice");
             else puts("Bob");
         }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Android
    Android
    Android
    Android
    Android
    Android
    Android
    Android
    Android
    Android
  • 原文地址:https://www.cnblogs.com/Opaser/p/4510747.html
Copyright © 2020-2023  润新知