题目要求
小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。根据给定的射击坐标(x, y),请计算小E的射击得分。
思路分析
-
确定分数规则:靶分数从靶心(10分)开始逐层递减,每一层对应一个分数区间:
- 靶心内半径为1的圆得10分。
- 半径为2的圆得9分,以此类推,直到半径为10的圆得1分。
- 超出半径10的区域得0分。
-
计算距离:根据平面几何,点 (x,y) 到靶心 (0,0)) 的距离计算公式为: d=根号下x的平方加y的平方。根据距离 d的大小来判断点在哪个得分区间。
-
进行分数判断:利用圆的半径判断射击得分:
- 如果 d≤1,得10分。
- 如果 1<d≤2,得9分。
- 依次类推,如果9<d≤10,得1分。
- 如果 d>10 ,得0分。
代码实现
public class Main {
public static int solution(int x, int y) {
int score = 0; // 初始化分数
double dis = Math.sqrt(x * x + y * y); // 计算距离
for (int i = 1; i <= 10; i++) { // 从最内层的环开始逐层检查
if (dis <= i) {
score = 11 - i; // 如果距离小于或等于当前半径,得分为11 - i
return score; // 返回当前分数
}
}
return score; // 如果没有命中任何环,返回默认的0分
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(1, 0) == 10); // 应该输出 true
System.out.println(solution(1, 1) == 9); // 应该输出 true
System.out.println(solution(0, 5) == 6); // 应该输出 true
System.out.println(solution(3, 4) == 6); // 应该输出 true
}
}
知识总结
- 欧几里得距离:点 (x,y)到原点 (0,0)的距离计算公式为: d=根号下x的平方加y的平方。
- 条件判断与提前返回:通过
for循环和return提前返回结果,不仅简化了代码逻辑,还提高了效率。在满足条件时立即返回,可以避免不必要的计算。 - 逐步判断的优势:将条件判断与逐步判断结合,能清晰、准确地处理多层分区问题,并确保每种情况都能被正确处理。
学习建议
- 几何问题的分解:遇到几何问题时,首先简化图形的中心点(如原点),再通过距离公式进行分区判断。
- 条件逻辑的简化:将多重判断条件按分区范围顺序排布,避免过多的条件嵌套,提高代码可读性。
- 数学基础:熟悉平面几何公式,尤其是距离和圆的半径公式,有助于解决类似的计算问题。
个人思考
这道题目感觉比较简单,感觉最主要的是想到利用数学中欧几里得距离来解答。由于在编程中,几何和条件判断问题经常出现,掌握数学工具和条件判断优化的方法至关重要。我在写的时候画了示意图,通过实际例子可以提升理解,在图形模拟中直观地观察坐标位置与分数的关系。通过简化分数判断逻辑,也可以提升代码效率。