0
已解决
董宇昊
初级启示者
初级启示者
2276 cover经验值:0
题目描述 Description
一个n * n的网格图上有m个探测器,每个探测器有个探测半径 r,问这n * n个点中有多少个点能被探测到。
输入描述 Input Description
第一行3个整数n,m,r
接下来m行,每行两个整数x,y表示第i个探测器的坐标
输出描述 Output Description
能被探测到的点的个数
样例输入 Sample Input
5 2 1 3 3 4 2
样例输出 Sample Output
8
数据范围及提示 Data Size & Hint
1<=n,m<=100
0
已采纳
李秉轩
修练者
修练者
- int x[105],y[105];
- bool num[105][105];
- int main(){
- //freopen(".in","r",stdin);
- //freopen(".out","w",stdout);
- int n,m,r,cnt=0;
- cin>>n>>m>>r;
- for(int i=1;i<=m;i++){
- cin>>x[i]>>y[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=n;j++){
- for(int k=1;k<=m;k++){
- double dis=sqrt((i-x[k])*(i-x[k])+(j-y[k])*(j-y[k]));
- if(dis<=r){
- num[i][j]=true;
- }
- }
- }
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=n;j++){
- if(num[i][j]){
- cnt++;
- }
- }
- }
- cout<<cnt;
- //fclose(stdin);
- //fcolse(stdout);
0
0
陈振轩
高级光能
高级光能
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
for(int k=1; k<=m; k++){
if(sqrt((i-x[k])*(i-x[k])+(j-y[k])*(j-y[k]))<=r){
a[i][j]=1;
}
}
}
}
核心
定义一个二维数组a[105][105],用于标记能被探测到的点
输入n,m,r
输入m行
每行输入探测器坐标x,y
枚举横坐标x-r~X+r,纵坐标y-r~y+r范围内的点
if ( (i,j)与(×,y)之间的距离不超过r)
标记a[i][j]
遍历二维数组,计数a[i][j]!=0的点个数
前置知识:平面上两点之间的距离公式:
点(x1,y1)与点(x2,y2)之间的距离:sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) )
思路
0
0
李鑫羽
初级光能
初级光能
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=0;k<m;k++){
double s=sqrt((i-a[k])*(i-a[k])+(j-b[k])*(j-b[k]));
if(s<=r&&c[i][j]==0){
cnt++;
c[i][j]=1;
}
}
}
}
cout<<cnt;
0
胡焕宇
初级守护
初级守护
纠正一下李鑫羽 同学的代码
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
double s=sqrt((i-a[k])*(i-a[k])+(j-b[k])*(j-b[k]));
if(s<=r&&c[i][j]==0){
cnt++;
c[i][j]=1;
}
}
}
}
胡焕宇在2020-08-25 10:18:22追加了内容
不算完整代码吧
0
0
0