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 }