暑假集训(4)第八弹——— 组合(hdu1524)
2016-08-06 17:13 HUAS_周林微 阅读(272) 评论(0) 编辑 收藏 举报题意概括:你已经赢得两局,最后一局是N个棋子往后移动,最后一个无法移动的玩家失败。
题目分析:有向无环图sg值游戏,尼姆游戏的抽象表达。得到每个棋子的sg值之后,把他们异或起来,考察异或值是否为0.
1 #include "cstdio" 2 int figure[1004][1004]; 3 int sg[1004]; 4 int t; 5 void fbegin() 6 { 7 for (int i=0;i<1004;i++) 8 { 9 sg[i] = -1; 10 for (int j=0;j<1004;j++) 11 { 12 figure[i][j] = -1; 13 } 14 } 15 } 16 int dfs(int n) 17 { 18 if (sg[n] != -1) 19 return sg[n]; 20 int hash[1004] = {0}; 21 for (int i=0;i<t;i++) 22 { 23 if (figure[n][i] == 1) 24 hash[dfs(i)] = 1; 25 } 26 for (int i=0;;i++) 27 if (hash[i] == 0) 28 return sg[n] = i; 29 } 30 int main() 31 { 32 int a,b,sum; 33 while (scanf ("%d",&t) != EOF) 34 { 35 fbegin(); 36 for (int i=0;i<t;i++) 37 { 38 scanf ("%d",&a); 39 if (!a) 40 sg[i] = 0; 41 while (a-- && scanf ("%d",&b)) 42 { 43 figure[i][b] = 1; 44 } 45 } 46 while (scanf ("%d",&a) && a) 47 { 48 sum = 0; 49 while (a--) 50 { 51 scanf ("%d",&b); 52 sum ^= dfs(b); 53 } 54 printf ("%s\n",sum?"WIN":"LOSE"); 55 } 56 57 } 58 return 0; 59 }