一、题目
问题描述
一个 n × n 的网格图(标号由 1 开始)上有 m 个探测器,每个探测器有个探测半径 r ,问这 n × n 个点中有多少个点能被探测到。
输入
第一行 3 个整数 n,m,r。
接下来 m 行,每行两个整数 x,y表示第 i 个探测器的坐标。
输出
能被探测到的点的个数。
样例
输入 | 输出 |
---|---|
5 2 1 | 8 |
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函数计算在探测器覆盖范围内的点的数量。输出覆盖的点数。