#include<bits/stdc++.h> usingnamespace std; int n, m, k; int mcMap[115][115]; int flag[115][115]; voidfireLight(int x, int y) { mcMap[x][y] = 1; mcMap[max(1, x - 1)][y] = 1; mcMap[max(1, x - 2)][y] = 1; mcMap[max(1, x - 1)][max(1, y - 1)] = 1; mcMap[x][max(1, y - 1)] = 1; mcMap[x][max(1, y - 2)] = 1; mcMap[min(n, x + 1)][y] = 1; mcMap[min(n, x + 2)][y] = 1; mcMap[min(n, x + 1)][max(1, y - 1)] = 1; mcMap[x][min(n, y + 1)] = 1; mcMap[x][min(n, y + 2)] = 1; mcMap[max(1, x - 1)][min(n, y + 1)] = 1; mcMap[min(n, x + 1)][min(n, y + 1)] = 1; }
voidstoneLight(int x, int y) { mcMap[x][y] = 1; for (int i = max(1, x - 2); i <= min(n, x + 2); i++) { for (int j = max(1, y - 2); j <= min(n, y + 2); j++) { mcMap[i][j] = 1; } } } intmain() { scanf("%d%d%d", &n, &m, &k); // fire 2, stone 3, light 1 for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); flag[x][y] = 2; } for (int i = 1; i <= k; i++) { int x, y; scanf("%d%d", &x, &y); flag[x][y] = 3; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (flag[i][j] == 2) fireLight(i, j); elseif (flag[i][j] == 3) stoneLight(i, j); } } int sum = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (!mcMap[i][j]) sum++; } } printf("%d\n", sum); return0; }
后记
能 AC 的代码就是好代码。可以明显地看到我那个丑陋地 fireLight 函数,十二个位置直接暴力更新,实际上这是很容易犯错误地写法,如果写错了然后去找错误将是极大地麻烦。在 Github Copilot 地带领下很幸运我一次性写对了。正确地比较稳妥地方式是开dx[]和dy[]数组,将所有坐标一次性写出来,然后 for 循环去更新。
1 2
int dx1[13]={2,0,-2,0,1,1,1,0,0,0,-1,-1,-1}, dy1[13]={0,2,0,-2,0,1,-1,1,0,-1,0,1,-1};