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; }