SG函数打表,求NIM和!!!
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int sg[51][51]; 8 char str[51]; 9 void init() 10 { 11 int i,j,a,b,k; 12 bool vis[510]; 13 for(i=0;i<=50;i++){ 14 sg[i][0]=sg[0][i]=i; 15 } 16 for(i=1;i<=50;i++) 17 for(j=1;j<=50;j++){ 18 memset(vis,0,sizeof(vis)); 19 for(a=0;a<i;a++) 20 for(b=0;b<j;b++){ 21 vis[sg[i][b]^sg[a][j]]=1; 22 } 23 for(k=0;;k++) 24 if(vis[k]==0){ 25 sg[i][j]=k; 26 break; 27 } 28 } 29 } 30 int main() 31 { 32 int i,j,m,n,p; 33 init(); 34 while(scanf("%d%d",&n,&m)){ 35 if(!n&&!m) break; 36 p=0; 37 for(i=0;i<n;i++){ 38 scanf("%s",str); 39 for(j=0;j<m;j++){ 40 if(str[j]=='#'){ 41 p^=sg[i][j]; 42 } 43 } 44 } 45 puts(p?"John":"Jack"); 46 } 47 return 0; 48 }