poj 3537 Crosses and Crosses 博弈论

思路:每次画X之后都会形成2个子游戏,即i-3和n-i-2.

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cstring>
 7 using namespace std;
 8 int sg[2002];
 9 int getsg(int n)
10 {
11     if(n<=0) return 0;
12     if(sg[n]>=0) return sg[n];
13     bool vis[2002]={0};
14     for(int i=1;i<=n;i++){
15         vis[getsg(n-i-2)^getsg(i-3)]=1;
16     }
17     int i=0;
18     while(vis[i]) i++;
19     return sg[n]=i;
20 }
21 int main()
22 {
23     int n;
24     memset(sg,-1,sizeof(sg));
25     while(scanf("%d",&n)!=EOF){
26         puts(getsg(n)?"1":"2");
27     }
28     return 0;
29 }
View Code

原文地址:https://www.cnblogs.com/xin-hua/p/3317699.html