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
");
37     else printf("2
");
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/jie-dcai/p/3776868.html