解题思路:题目中有m个探测器,探测器的半径为r
我们以放置探测器的坐标为中心(x,y),假设距离中心能被探测器探测到的坐标与中心点的坐标距离为dx, dy;
算出所有可能的dx, dy;
通过dx,dy算出相应的坐标,在这些坐标中插入1;
最后判断坐标是否为真,计算这些坐标的总个数,就可得出被探测的点;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 110;
int b[N][N],a[N][N], n, m, r;
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;
}
int main()
{
cin >> n >> m >> r;
while(m--)
{
int x, y;
cin >> x >> y;
for(int dx = 0; dx <= r; dx++)
{
int dy = (int)sqrt((double)r * r - dx * dx);//dx * dx + dy * dy = r * r;
int x1 = max(x - dx, 1);//计算x左边可能被探测到的点,因为x - dx 可能为负,即超出边界
int y1 = max(y - dy, 1);
int x2 = min(x + dx, n);//计算x右边可能被探测到的点,因为x - dx 可能大于边界n,但最多为n ,不能超过边界
int y2 = min(y + dy, n);
insert(x1, y1, x2, y2, 1);
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
a[i][j] = a[i - 1][j] +a[i][j - 1] - a[i - 1][j - 1] + b[i][j];
int sum = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(a[i][j]) sum++;
cout << sum << endl;
return 0;
}