蓝桥杯:信号覆盖
本题的考点是模拟,我们通过枚举每个点与信号塔之间的距离,与半径进行比较,如果半径大于距离,那么该点可以被覆盖,计数器加一,由二维空间,两点之间的距离公式计算每个点与信号塔之间的距离double d = sqrt(pow(xh[i].x1 - j, 2) + pow(xh[i].y1 - k, 2));注意这里d的类型为double,因为如果定义为int,sqrt是向下取整,d变小,会统计多余的点,导致计数器不正确,枚举完所有的距离之后,输出cnt即可
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N = 1e2+10;
#define int long long
int w,h,n,r;
bool vis[N][N];
bool vis1[N][N];
struct xinhao{
int x1;
int y1;
}xh[N];
int whd[N][N];
signed main() {
cin>>w>>h>>n>>r;
for(int i = 1;i<=n;i++){
int x,y;cin>>x>>y;
if(!vis1[x][y]){
xh[i].x1 = x;
xh[i].y1 = y;
vis1[x][y]=1;
}
}
int cnt = 0;
// double d = sqrt(pow(xh[i].x1 - j, 2) + pow(xh[i].y1 - k, 2));
for(int i = 1;i <= n;i++){
for(int j = 0;j<=w;j++){
for(int k = 0;k<=h;k++){
double d = sqrt(pow(xh[i].x1 - j, 2) + pow(xh[i].y1 - k, 2));
if(!vis[j][k]&&d<=r){
cnt++;
vis[j][k]=1;
}
}
}
}
cout<<cnt;
return 0;
}