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

66 阅读3分钟

题目要求

小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
}
}

知识总结

  1. 欧几里得距离:点 (x,y)到原点 (0,0)的距离计算公式为: d=根号下x的平方加y的平方。
  2. 条件判断与提前返回:通过 for 循环和 return 提前返回结果,不仅简化了代码逻辑,还提高了效率。在满足条件时立即返回,可以避免不必要的计算。
  3. 逐步判断的优势:将条件判断与逐步判断结合,能清晰、准确地处理多层分区问题,并确保每种情况都能被正确处理。

学习建议

  1. 几何问题的分解:遇到几何问题时,首先简化图形的中心点(如原点),再通过距离公式进行分区判断。
  2. 条件逻辑的简化:将多重判断条件按分区范围顺序排布,避免过多的条件嵌套,提高代码可读性。
  3. 数学基础:熟悉平面几何公式,尤其是距离和圆的半径公式,有助于解决类似的计算问题。

个人思考

这道题目感觉比较简单,感觉最主要的是想到利用数学中欧几里得距离来解答。由于在编程中,几何和条件判断问题经常出现,掌握数学工具和条件判断优化的方法至关重要。我在写的时候画了示意图,通过实际例子可以提升理解,在图形模拟中直观地观察坐标位置与分数的关系。通过简化分数判断逻辑,也可以提升代码效率。

小菜鸟在不断进步~~~一起加油! (2024.11.05)