HDU 4678 Mine

对于每个空白区域,求SG值。

最后异或起来等于0,先手必败。

  1 #pragma comment(linker,"/STACK:102400000,102400000")
  2 #include<cstdio>
  3 #include<cstring>
  4 #define MAXN 1010
  5 #define oo 1234567890
  6 int arr[MAXN][MAXN];
  7 bool vis[MAXN][MAXN];
  8 int n, m;
  9 int dg, bk;
 10 int sg[MAXN * MAXN][2];
 11 int go[8][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 }, { -1, -1 },
 12         { -1, 1 }, { 1, -1 }, { 1, 1 } };
 13 bool isIn(int x, int y) {
 14     return x >= 0 && x < n && y >= 0 && y < m;
 15 }
 16 int SG(int digit, int blank) {
 17     if (sg[digit][blank] == -1) {
 18         int x, y;
 19         x = y = -1;
 20         if (blank) {
 21             x = SG(0, 0);
 22         }
 23         if (digit) {
 24             y = SG(digit - 1, blank);
 25         }
 26         for (int i = 0;; i++) {
 27             if (i != x && i != y) {
 28                 sg[digit][blank] = i;
 29                 break;
 30             }
 31         }
 32     }
 33     return sg[digit][blank];
 34 }
 35 void dfs(int x, int y) {
 36     vis[x][y] = true;
 37     if (arr[x][y] > 0) {
 38         dg++;
 39     } else if (arr[x][y] == 0) {
 40         bk = 1;
 41         int nx, ny;
 42         for (int i = 0; i < 8; i++) {
 43             nx = x + go[i][0];
 44             ny = y + go[i][1];
 45             if (isIn(nx, ny) && !vis[nx][ny]) {
 46                 dfs(nx, ny);
 47             }
 48         }
 49     }
 50 }
 51 int main() {
 52     int T;
 53     int ca = 1;
 54     int x, y;
 55     int i, j, k;
 56     int res;
 57     memset(sg, -1, sizeof(sg));
 58     sg[0][0] = 0;
 59     scanf("%d", &T);
 60     while (T--) {
 61         scanf("%d%d%d", &n, &m, &k);
 62         memset(arr, 0, sizeof(arr));
 63         while (k--) {
 64             scanf("%d%d", &x, &y);
 65             arr[x][y] = -oo;
 66         }
 67         for (i = 0; i < n; i++) {
 68             for (j = 0; j < m; j++) {
 69                 if (arr[i][j] < 0) {
 70                     for (k = 0; k < 8; k++) {
 71                         x = i + go[k][0];
 72                         y = j + go[k][1];
 73                         if (isIn(x, y)) {
 74                             arr[x][y]++;
 75                         }
 76                     }
 77                 }
 78             }
 79         }
 80         res = 0;
 81         memset(vis, false, sizeof(vis));
 82         for (i = 0; i < n; i++) {
 83             for (j = 0; j < m; j++) {
 84                 if (!vis[i][j] && arr[i][j] == 0) {
 85                     dg = bk = 0;
 86                     dfs(i, j);
 87                     res ^= SG(dg, bk);
 88                 }
 89             }
 90         }
 91         for (i = 0; i < n; i++) {
 92             for (j = 0; j < m; j++) {
 93                 if (!vis[i][j]) {
 94                     dg = bk = 0;
 95                     dfs(i, j);
 96                     res ^= SG(dg, bk);
 97                 }
 98             }
 99         }
100         if (res) {
101             printf("Case #%d: Xiemao\n", ca++);
102         } else {
103             printf("Case #%d: Fanglaoshi\n", ca++);
104         }
105     }
106     return 0;
107 }
View Code

相关文章: