POJ 3537
利用后继节点的SG值求出当前的SG值。
在当前任意一个BLANK插入一个x后,分成两段,于是,看成两段的NIM,异或和,按SG的定义求出当前的SG值即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int MAX=2010; 7 int sg[MAX]; 8 bool save[MAX]; 9 10 int get(int len){ 11 for(int i=0;i<MAX;i++) 12 if(!save[i]) return i; 13 } 14 15 int main(){ 16 int mid; int len,a,b,ans; 17 sg[0]=0;sg[1]=sg[2]=sg[3]=1; 18 for(int i=4;i<=2000;i++){ 19 memset(save,false,sizeof(save)); 20 len=0; 21 if(i&1) mid=i/2+1; 22 else mid=i/2; 23 for(int k=1;k<=mid;k++){ 24 a=k-3; b=i-k-2; 25 if(a<0) a=0; 26 if(b<0) b=0; 27 ans=sg[a]^sg[b]; 28 save[ans]=true; 29 } 30 sg[i]=get(len); 31 } 32 // for(int i=1;i<=15;i++) 33 // printf("%d ",sg[i]); 34 int n; 35 while(scanf("%d",&n)!=EOF){ 36 if(sg[n]) printf("1\n"); 37 else printf("2\n"); 38 } 39 return 0; 40 }