青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

51 阅读5分钟

为了计算小E在给定射击坐标 (x,y) 上的得分,我们需要先确定射击点落在靶上的哪个区域。靶心位于 (0,0),并且每个环的边界由半径决定。从靶心向外,每个环的半径依次增加1,直到第10环的外部。

步骤分析

  1. 计算距离:首先,我们需要计算射击点 (x,y) 到靶心 (0,0) 的欧几里得距离。这个距离 d 可以用以下公式计算:

d=x2+y2​

  1. 确定环数:接下来,我们需要根据计算出的距离 d 来确定射击点落在哪个环上。由于每个环的半径依次增加1(从靶心的半径1开始),我们可以通过比较 d 与各个环的半径来确定环数。

    • 如果 0≤d<1,则射击点落在靶心上,得10分。
    • 如果 1≤d<2,则射击点落在第1环内,得9分。
    • 如果 2≤d<3,则射击点落在第2环内,得8分。
    • 以此类推,直到第9环。
    • 如果 9≤d<10,则射击点落在第10环内,得1分。
    • 如果 d≥10,则射击点超出所有环,得0分。
  2. 返回得分:最后,根据确定的环数返回相应的得分。

实现代码(Python)

python复制代码
	import math

	 

	def calculate_score(x, y):

	    # 计算射击点到靶心的距离

	    distance = math.sqrt(x**2 + y**2)

	    

	    # 根据距离确定环数并返回得分

	    if 0 <= distance < 1:

	        return 10

	    elif 1 <= distance < 2:

	        return 9

	    elif 2 <= distance < 3:

	        return 8

	    elif 3 <= distance < 4:

	        return 7

	    elif 4 <= distance < 5:

	        return 6

	    elif 5 <= distance < 6:

	        return 5

	    elif 6 <= distance < 7:

	        return 4

	    elif 7 <= distance < 8:

	        return 3

	    elif 8 <= distance < 9:

	        return 2

	    elif 9 <= distance < 10:

	        return 1

	    else:

	        return 0

	 

	# 示例使用

	x, y = 3, 4  # 假设射击坐标为 (3, 4)

	score = calculate_score(x, y)

	print("射击得分:", score)  # 输出应该是5,因为 (3, 4) 落在第5环内

这段代码通过计算射击点到靶心的距离,并根据距离来确定射击点落在哪个环上,最后返回相应的得分。这种方法简单且高效,适用于计算二维平面上的点相对于一个中心点的环形区域得分。 上面的代码是一个用于计算射击得分的Python函数。这个函数接收两个参数 x 和 y,它们代表射击点在二维平面上的坐标。靶心位于坐标原点 (0, 0),并且靶被分成10个环,每个环的半径依次增加1,从靶心的半径1开始。射击点的得分取决于它到靶心的距离。

代码分析

  1. 函数定义

    python复制代码
    	def calculate_score(x, y):
    

    这行代码定义了一个名为 calculate_score 的函数,它接受两个参数 x 和 y

  2. 计算距离

    python复制代码
    	distance = math.sqrt(x**2 + y**2)
    

    这行代码使用欧几里得距离公式计算了射击点 (x, y) 到靶心 (0, 0) 的距离。math.sqrt 是Python标准库 math 模块中的一个函数,用于计算平方根。这里,x**2 + y**2 计算了射击点坐标的平方和,然后取平方根得到距离。

  3. 确定环数并返回得分

    python复制代码
    	if 0 <= distance < 1:
    
    	    return 10
    
    	elif 1 <= distance < 2:
    
    	    return 9
    
    	# ... (省略了中间的elif语句)
    
    	else:
    
    	    return 0
    

    这部分代码通过一系列的 if-elif-else 语句来检查 distance 的值,并根据它落在哪个区间内来确定环数和得分。从靶心开始,每个环的半径增加1,因此每个 if 或 elif 语句都检查 distance 是否落在某个环的半径范围内。如果 distance 落在某个环内,就返回相应的得分(从10分到1分)。如果 distance 大于或等于10,则射击点超出所有环,返回0分。

代码效率

  • 时间复杂度:这个函数的时间复杂度是 O(1),因为它只执行了固定数量的计算和比较操作,与输入的大小无关。
  • 空间复杂度:这个函数的空间复杂度也是 O(1),因为它只使用了固定数量的额外空间(即几个变量)。

改进建议

虽然这个函数在功能上是正确的,但可以通过一些改进来提高其可读性和可维护性:

  • 使用列表或字典:可以将环的半径和得分存储在一个列表或字典中,然后使用一个循环来查找得分,而不是使用一系列的 if-elif-else 语句。
  • 添加注释:可以在代码中添加注释来解释每个步骤的目的,特别是对于计算距离和确定环数的部分。
  • 错误处理:虽然在这个特定的函数中可能不是必需的,但在实际应用中,添加错误处理(例如,检查输入是否是有效的数字)可以使函数更加健壮。

示例改进代码(使用列表)

python复制代码
	def calculate_score(x, y):

	    distance = math.sqrt(x**2 + y**2)

	    scores = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]  # 列表存储每个环的得分

	    ring = min(int(distance), 9)  # 将距离转换为环数(最大为9,因为第10环的边界是distance < 10)

	    return scores[ring] if ring >= 0 else 0  # 返回得分,如果ring小于0则返回0分

这个改进的版本使用了一个列表来存储每个环的得分,并通过将距离转换为环数(使用 int(distance) 并取最小值9来确保不会超出列表范围)来查找得分。如果计算出的环数小于0(这在这个特定问题中不会发生,但作为一个防御性编程措施),则返回0分。