小S的坐标系菱形统计 | 豆包MarsCode AI刷题

152 阅读4分钟

小S的坐标系菱形统计 - MarsCode

问题描述

小S正在研究坐标系中的几何图形,特别是菱形。现在给定一个X轴和Y轴的范围,他希望统计在坐标系内满足以下三个条件的菱形的总数:

  1. 菱形具有正面积。
  2. 菱形的每个顶点的横坐标xixi​和纵坐标yiyi​都是整数,且满足0≤xi≤X0≤xi​≤X 和 0≤yi≤Y0≤yi​≤Y。
  3. 菱形的对角线平行于坐标轴。

你需要帮助小S计算出满足这些条件的菱形的总数。


测试样例

样例1:

输入:x = 2 ,y = 2
输出:1

样例2:

输入:x = 3 ,y = 3
输出:4

样例3:

输入:x = 4 ,y = 2
输出:4

在这个问题中,我们需要在给定的坐标范围内找到满足一定条件的菱形的数量。题目给出了一些约束条件,具体要求是菱形的对角线必须平行于坐标轴,且顶点的坐标是整数。

分析

  1. 菱形的构造

    • 一个菱形的四个顶点可以被看作中心点在 (cx,cy)(cx, cy)(cx,cy) ,然后根据对角线长度决定顶点位置。对于菱形来说,菱形的两个对角线相互垂直并且平行于坐标轴。
  2. 对角线平行于坐标轴

    • 如果我们定义菱形的中心点为 (cx,cy)(cx, cy)(cx,cy),那么可以让一个对角线的端点分别位于 (cx+dx,cy)(cx + dx, cy)(cx+dx,cy) 和 (cx−dx,cy)(cx - dx, cy)(cx−dx,cy),另一个对角线的端点在 (cx,cy+dy)(cx, cy + dy)(cx,cy+dy) 和 (cx,cy−dy)(cx, cy - dy)(cx,cy−dy)。
    • 这里,dxdxdx 和 dydydy 是整数,表示对角线的“半长”。那么,一个菱形可以通过参数 dxdxdx 和 dydydy 的不同组合来构建。
  3. 条件检查

    • 为了确保菱形的顶点都在给定的坐标范围内,我们需要满足:

      • 0≤cx−dx0 \leq cx - dx0≤cx−dx 且 cx+dx≤Xcx + dx \leq Xcx+dx≤X
      • 0≤cy−dy0 \leq cy - dy0≤cy−dy 且 cy+dy≤Ycy + dy \leq Ycy+dy≤Y
    • 这些条件确保了菱形的顶点都在范围内。

  4. 菱形具有正面积

    • 要保证菱形的面积为正,需要 dx>0dx > 0dx>0 和 dy>0dy > 0dy>0。

算法步骤

  1. 遍历所有可能的中心点 (cx,cy)(cx, cy)(cx,cy)。
  2. 对每个中心点,枚举可能的 dxdxdx 和 dydydy。
  3. 对于每一组 (cx,cy,dx,dy)(cx, cy, dx, dy)(cx,cy,dx,dy),检查是否满足条件。
  4. 统计符合条件的菱形数量。

代码实现

python

def solution(X, Y): count = 0

# 遍历所有中心点
for cx in range(X + 1):
    for cy in range(Y + 1):
        # 枚举 dx 和 dy
        dx = 1
        while cx - dx >= 0 and cx + dx <= X:
            dy = 1
            while cy - dy >= 0 and cy + dy <= Y:
                count += 1
                dy += 1
            dx += 1

return count

测试样例

print(solution(2, 2)) # 输出:1 print(solution(3, 3)) # 输出:4 print(solution(4, 2)) # 输出:4

解释

  1. 外层循环:遍历所有可能的中心点 (cx,cy)(cx, cy)(cx,cy)。
  2. 内层循环:对于每个中心点,尝试不同的 dxdxdx 和 dydydy 值,检查是否满足边界条件。
  3. 条件检查:每找到一个符合条件的组合,计数加一。
  4. 返回结果:最终返回符合条件的菱形总数。

时间复杂度

  • 时间复杂度:O(X×Y×X2×Y2)O(X \times Y \times \frac{X}{2} \times \frac{Y}{2})O(X×Y×2X​×2Y​),其中每个点的可能组合受到 XXX 和 YYY 的限制,实际复杂度会低于最大值。

测试样例结果

  • 输入 X = 2, Y = 2,输出 1
  • 输入 X = 3, Y = 3,输出 4
  • 输入 X = 4, Y = 2,输出 4

该问题要求统计坐标系中满足条件的菱形数量,其中菱形的四个顶点坐标是整数,对角线平行于坐标轴。为了实现这一点,首先设定菱形的中心点 (cx,cy)(cx, cy)(cx,cy),然后定义两个对角线的半长度 dxdxdx 和 dydydy,分别控制水平和垂直方向上的扩展。为确保菱形顶点在范围内,需要满足:0≤cx−dx0 \leq cx - dx0≤cx−dx,cx+dx≤Xcx + dx \leq Xcx+dx≤X,0≤cy−dy0 \leq cy - dy0≤cy−dy,cy+dy≤Ycy + dy \leq Ycy+dy≤Y。通过遍历每个中心点以及所有可能的 dxdxdx、dydydy 组合,验证是否符合范围条件并计数。算法复杂度为 O(X×Y×X2×Y2)O(X \times Y \times \frac{X}{2} \times \frac{Y}{2})O(X×Y×2X​×2Y​),通过逐点枚举中心和对角线长度,统计符合条件的菱形数量,确保所有有效菱形被计入。