火把用偏量数组表示范围
因为萤石范围是正方形,故直接双循环更方便
考虑到数组会越界,我们可以把数组扩大一点
把(3.3)作为数组原点,遍历也从(3.3)开始,就不必考虑数组越界了
以下是AC代码,算是题解里比较简单和清晰的了
#include<iostream>
using namespace std;
int a[110][110], sum, n, m, k;
int main() {
cin >> n >> m >> k;
int x=0, y=0;
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 };
while (m--) {
cin >> x >> y;
x += 2, y += 2;
for (int i = 0; i < 13; i++)
a[x + dx1[i]][y + dy1[i]] = 1;
}
while (k--) {
cin >> x >> y;
x += 2; y += 2;
for (int i = x - 2; i <= x + 2; i++)
for (int j = y - 2; j <= y + 2; j++)
a[i][j] = 1;
}
for (int i = 3; i <= n+2; i++)
for (int j = 3; j <= n+2; j++)
if (!a[i][j]) sum++;
cout << sum;
return 0;
}