poj 2425 A Chess Game 博弈论

思路:SG函数应用!!

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<vector>
 5 #include<cstring>
 6 using namespace std;
 7 int sg[1001],n;
 8 vector<int>p[1001];
 9 int dfs(int now)
10 {
11     if(sg[now]!=-1) return sg[now];
12     bool vis[1001]={0};
13     for(int i=0;i<p[now].size();i++)
14         vis[dfs(p[now][i])]=1;
15     int i=0;
16     while(vis[i]) i++;
17     return sg[now]=i;
18 }
19 int main()
20 {
21     int a,b,q,k;
22     while(scanf("%d",&n)!=EOF){
23         memset(sg,-1,sizeof(sg));
24         for(int i=0;i<n;i++){
25             scanf("%d",&a);
26             p[i].clear();
27             for(int j=0;j<a;j++){
28                 scanf("%d",&b);
29                 p[i].push_back(b);
30             }
31         }
32         while(scanf("%d",&q)&&q){
33             int ans=0;
34             for(int i=0;i<q;i++){
35                 scanf("%d",&k);
36                 ans^=dfs(k);
37             }
38             puts(ans?"WIN":"LOSE");
39         }
40     }
41     return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3316762.html