代码改变世界

暑假集训(4)第八弹——— 组合(hdu1524)

2016-08-06 17:13  HUAS_周林微  阅读(268)  评论(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 }
View Code