uva 1378 A Funny Stone Game (博弈-SG)

题目链接:http://vjudge.net/problem/viewProblem.action?id=41555

把第i堆的每个石子看出一堆个数为n-i的石子,转换为组合游戏

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
using namespace std;

#define N 30

int a[N],sg[N];
void cal_sg(){
    int i;
    sg[0]=0;
    for(i=1;i<N;i++){
      int vis[100];
      memset(vis,0,sizeof vis);
      for(int j=0;j<i;j++)
        for(int k=j;k<i;k++)vis[sg[j]^sg[k]]=1;
      for(int j=0;j<100;j++)if(!vis[j])
        {sg[i]=j;break;}
    }     
}
int main(){
   int n,cs=1;
   cal_sg();
   while(scanf("%d",&n) && n){
      int i;
      for(i=0;i<n;i++)scanf("%d",&a[i]);
      int ans=0;
      for(i=0;i<n;i++)if(a[i]&1)ans^=sg[n-i-1];
      printf("Game %d: ",cs++);
      if(ans==0)printf("-1 -1 -1\n");
      else{
         int k,j,flag=0;
         for(i=0;i<n-1;i++)if(a[i]){
           for(k=i+1;k<n;k++){
            for(j=k;j<n;j++){
               if(!(ans^sg[n-i-1]^sg[n-k-1]^sg[n-j-1]))flag=1;
               if(flag)break;
            }
            if(flag)break;
           }
           if(flag)break;
         }
         printf("%d %d %d\n",i,k,j);
      }
   }
   return 0;
}


posted @ 2014-08-12 22:03  Ixia  阅读(307)  评论(0编辑  收藏  举报