看了别人的博客,非常通俗易懂啊,从Nim 博弈开始讲的,讲述了关于 Nim 博弈的策略,还有 sg 值的作用及推导,然后讲解了Nim 博弈的变形,很好玩
http://blog.csdn.net/flqbestboy/article/details/8222603
有很大收获,记录一波!
然后来做个题目:小Hi和小Ho的对弈游戏
树的删边游戏,sg 值的运用,最后还是归到 Nim 博弈上来
还是不会可以看看 http://blog.sina.com.cn/s/blog_51cea4040100h5j4.html
此题代码:

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <vector> 6 using namespace std; 7 #define MX 100005 8 9 int f[MX]; 10 vector<int> son[MX]; 11 int sg[MX]; 12 char ans[30]; 13 14 void dfs(int x) 15 { 16 for (int i=0;i<son[x].size();i++) 17 dfs(son[x][i]); 18 sg[x]=0; 19 for (int i=0;i<son[x].size();i++) 20 sg[x] ^= (sg[son[x][i]]+1); 21 } 22 23 int main() 24 { 25 int Q; 26 cin>>Q; 27 int k=0; 28 while (Q--) 29 { 30 int n; 31 scanf("%d",&n); 32 for (int i=1;i<=n;i++) f[i]=i; 33 for (int i=1;i<=n;i++) son[i].clear(); 34 35 for (int i=0;i<n-1;i++) 36 { 37 int x,y; 38 scanf("%d%d",&x,&y); 39 f[y]=x; 40 son[x].push_back(y); 41 } 42 int root; 43 for (int i=1;i<=n;i++) 44 if (f[i]==i) 45 root=i; 46 dfs(root); 47 48 if (sg[root]==0) 49 ans[k++]='0'; 50 else 51 ans[k++]='1'; 52 53 int tp=0; 54 for (int i=0;i<son[root].size();i++) 55 tp^=sg[son[root][i]]; 56 if (tp==0) 57 ans[k++]='0'; 58 else 59 ans[k++]='1'; 60 } 61 ans[k++]='