小E的射击训练|豆包MarsCode AI刷题

131 阅读2分钟

01问题

问题描述

小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。

根据给定的射击坐标(x, y),请计算小E的射击得分。


测试样例

样例1:

输入:x = 1, y = 0 输出:10

样例2:

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

样例3:

输入:x = 0, y = 5 输出:6

样例4:

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

02思路

计算射击坐标(x, y)距圆心的距离,若射击点在某个半径为i的圆内,用11-i计算得分,如果果射击点超出所有的环,则得0分。

03代码

方法一

计算射击坐标(x, y)距圆心的距离,若射击点在某个半径为i的圆内,用11-i计算得分,如果果射击点超出所有的环,则得0分。

import math
def solution(x: int, y: int) -> int:
    # write code here
    # 计算射击坐标(x, y)距靶心的距离
    d = math.sqrt(x * x + y * y)
    # print(d)
    # 向上取整
    d = math.ceil(d)
    # print(d)
    if d > 10:
        return 0
    return 11 - d

if __name__ == '__main__':
    print(solution(1, 0) == 10)
    print(solution(1, 1) == 9)
    print(solution(0, 5) == 6)
    print(solution(3, 4) == 6)

方法二

通过从1到10循环每个圆的半径,来判断该点属于哪个圆,便可以算出得分

def solution(x: int, y: int) -> int:
    # write code here
    for r in range(1, 11):
        # 在圆内或在圆上
        if x * x + y * y <= r * r:
            return 11 - r
    # 如果不在这些圆内,得分为0
    return 0

if __name__ == '__main__':
    print(solution(1, 0) == 10)
    print(solution(1, 1) == 9)
    print(solution(0, 5) == 6)
    print(solution(3, 4) == 6)