小E的射击训练

154 阅读4分钟

这个题目模拟的是射击靶的得分系统。给定一个射击点 (x, y),我们需要计算该点到靶心 (0, 0) 的距离,然后根据该距离返回相应的得分。

靶心到射击点的距离可以通过勾股定理来计算,具体公式为:

distance=x2+y2distance=x2+y2​

根据距离的不同,得分也不同。具体得分规则如下:

  • 距离在 1 以下,得 10 分;
  • 距离在 1 到 2 之间,得 9 分;
  • 距离在 2 到 3 之间,得 8 分;
  • 依此类推,直到距离大于 10,得 0 分。

思路

  1. 计算距离:首先,我们需要计算点 (x, y) 到靶心 (0, 0) 的距离。

    • 使用勾股定理distance = sqrt(x^2 + y^2)
  2. 判断距离:然后根据计算出来的距离判断对应的得分区间:

    • 如果距离小于等于 1,返回 10 分;
    • 如果距离大于 1 但小于等于 2,返回 9 分;
    • 如果距离大于 2 但小于等于 3,返回 8 分;
    • 以此类推,如果距离大于 10,返回 0 分。
  3. 返回得分:根据判断结果返回相应的得分。

代码详解

pythonCopy Code
import math

def solution(x: int, y: int) -> int:
    # 计算射击点 (x, y) 到靶心 (0, 0) 的距离
    distance = math.sqrt(x**2 + y**2)
    
    # 根据距离判断得分
    if distance <= 1:
        return 10  # 如果距离小于等于1,得10分
    elif distance <= 2:
        return 9   # 如果距离小于等于2,得9分
    elif distance <= 3:
        return 8   # 如果距离小于等于3,得8分
    elif distance <= 4:
        return 7   # 如果距离小于等于4,得7分
    elif distance <= 5:
        return 6   # 如果距离小于等于5,得6分
    elif distance <= 6:
        return 5   # 如果距离小于等于6,得5分
    elif distance <= 7:
        return 4   # 如果距离小于等于7,得4分
    elif distance <= 8:
        return 3   # 如果距离小于等于8,得3分
    elif distance <= 9:
        return 2   # 如果距离小于等于9,得2分
    elif distance <= 10:
        return 1   # 如果距离小于等于10,得1分
    else:
        return 0   # 如果距离大于10,得0分

if __name__ == '__main__':
    # 测试样例
    print(solution(1, 0) == 10)  # (1, 0) 距离为 1,得分为 10
    print(solution(1, 1) == 9)   # (1, 1) 距离为 sqrt(2),得分为 9
    print(solution(0, 5) == 6)   # (0, 5) 距离为 5,得分为 6
    print(solution(3, 4) == 6)   # (3, 4) 距离为 5,得分为 6

代码解析

  1. 导入 math 库

    • import math:用于计算平方根,math.sqrt 可以帮助我们计算射击点到靶心的距离。
  2. 函数 solution(x, y)

    • 参数x 和 y 分别表示射击点在平面上的横坐标和纵坐标。

    • 计算距离:通过勾股定理计算距离:

      pythonCopy Code
      distance = math.sqrt(x**2 + y**2)
      
    • 判断得分:根据 distance 的值判断应该返回的得分。

      • 如果距离小于等于 1,返回 10 分。
      • 如果距离大于 1 小于等于 2,返回 9 分。
      • 依此类推,直到超过 10 时,返回 0 分。
  3. 主程序块

    • 在 if __name__ == '__main__': 中执行了四个测试用例,检查不同射击点的得分是否符合预期。

测试样例

  • solution(1, 0)

    • (x, y) = (1, 0),距离为 sqrt(1^2 + 0^2) = 1,得分为 10。
  • solution(1, 1)

    • (x, y) = (1, 1),距离为 sqrt(1^2 + 1^2) = sqrt(2),大约为 1.414,得分为 9。
  • solution(0, 5)

    • (x, y) = (0, 5),距离为 sqrt(0^2 + 5^2) = 5,得分为 6。
  • solution(3, 4)

    • (x, y) = (3, 4),距离为 sqrt(3^2 + 4^2) = 5,得分为 6。

图解

为了更直观地理解,可以画出射击点 (x, y) 到靶心 (0, 0) 的距离。假设靶心是坐标原点,得分是根据射击点到靶心的距离来决定的,具体规则如下:

  • 圆的半径是 1 到 10 之间的值,表示不同的得分区域:

    • 半径为 1 的圆:得分 10
    • 半径为 2 的圆:得分 9
    • 半径为 3 的圆:得分 8
    • ...
    • 半径为 10 的圆:得分 1
    • 超过半径 10 的点,得分为 0

复杂度分析

  • 时间复杂度:每次调用 solution(x, y) 函数时,计算距离只需要常数时间(O(1)),因此整个函数的时间复杂度是 O(1)
  • 空间复杂度:除了存储输入和计算的距离外,程序只使用了常数的额外空间,因此空间复杂度也是 O(1)

总结

这个程序通过计算射击点到靶心的距离来决定得分。代码清晰简洁,按照给定的规则正确地计算出得分。根据不同的测试输入,程序可以快速给出准确的结果。