用python实现一个 n × n 的网格图(标号由 1 开始)上有 m 个探测器,每个探测器有个探测半径 r ,问这 n × n 个点中有多少个点能被探测到。

本文介绍了如何通过编程解决一个关于n×n网格图中,给定m个探测器及其半径的问题,计算能被探测到的点的数量。文章详细阐述了判断点是否在探测器范围内的函数is_detected以及整体的计数函数count_detected_points的实现过程。
摘要由CSDN通过智能技术生成

一、题目

问题描述

一个 n × n 的网格图(标号由 1 开始)上有 m 个探测器,每个探测器有个探测半径 r ,问这 n × n 个点中有多少个点能被探测到。

输入

第一行 3 个整数 n,m,r。
接下来 m 行,每行两个整数 x,y表示第 i 个探测器的坐标。

输出

能被探测到的点的个数。

样例
输入输出
5 2 18
3 3
4 2

二、解析

首先需要一个函数来判断一个点是否在任何一个探测器的探测范围内。探测器的探测范围可以理解为以探测器为中心、探测半径为半径的圆形区域。我们可以通过计算一个点与探测器中心点之间的距离,来判断该点是否在探测范围内。如果一个点到探测器中心的欧氏距离小于或等于探测半径,那么这个点就可以被探测到。

三、代码实现

def is_detected(x, y, detector_x, detector_y, radius):
    # 判断点(x, y)是否在以(detector_x, detector_y)为中心,radius为半径的圆内
    return (x - detector_x) ** 2 + (y - detector_y) ** 2 <= radius ** 2


def count_detected_points(n, detectors, radius):
    detected_points = set()

    for i in range(1, n + 1):
        for j in range(1, n + 1):
            for detector in detectors:
                detector_x, detector_y = detector
                if is_detected(i, j, detector_x, detector_y, radius):
                    detected_points.add((i, j))
                    break

    return len(detected_points)


# 从输入中读取数据
n, m, r = map(int, input().split())
detectors = []
for _ in range(m):
    x, y = map(int, input().split())
    detectors.append((x, y))

# 计算并输出结果
print(count_detected_points(n, detectors, r))
代码解释

函数is_detected
目的:判断一个点是否位于以某个探测器为中心、特定半径的圆形范围内。
参数
x, y:需要判断的点的坐标。
detector_x, detector_y:探测器的中心点坐标。
radius:探测器的覆盖半径。
逻辑:通过计算点(x, y)到探测器中心点(detector_x, detector_y)的欧氏距离的平方,和探测器半径的平方进行比较。如果该距离的平方小于或等于半径的平方,说明点(x, y)在探测器的覆盖范围内,函数返回True;否则返回False。
实现:使用公式来实现。

函数 count_detected_points
目的:计算在一个n×n的网格内,有多少个点位于至少一个探测器的覆盖范围内。
参数:n:网格的大小,即网格是n×n的。
detectors:一个包含多个探测器坐标的列表,每个探测器坐标是一个元组形式(x, y)。
radius:探测器的覆盖半径。
逻辑
遍历网格内的每一个点(i, j)。对于每一个点,检查它是否位于任何一个探测器的覆盖范围内。这是通过is_detected函数实现的。如果点(i, j)位于至少一个探测器的覆盖范围内,就将其添加到detected_points集合中。使用集合是为了避免重复计算同一个点。最后,返回被探测到的点的总数。
实现:主要是通过嵌套循环来实现的,外层循环遍历所有点,内层循环遍历所有探测器。
主体逻辑
目的:从用户输入中读取数据,调用count_detected_points函数计算覆盖的点数,并输出结果。
实现步骤
读取n(网格大小)、m(探测器数量)、r(探测器半径)。读取m个探测器的坐标,存储在detectors列表中。调用count_detected_points函数计算在探测器覆盖范围内的点的数量。输出覆盖的点数。

四、运行结果

在这里插入图片描述

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@撒娇小小怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值