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

70 阅读5分钟

image.png

问题分析

题目给出的靶环得分规则是基于欧几里得距离的。计算点 ((x, y)) 到靶心 ((0, 0)) 的距离,然后根据这个距离判断得分。

  1. 计算点到靶心的距离:使用公式

image.png

  1. 判断距离所属的环: -如果d<=1 ,得 10 分; -如果1<=d<=2,得 9 分;
  • 依此类推,直到第 10 环 (9<d<=10) 得 1 分;
  • 如果d>10,得 0 分。

代码实现

以下是解决方案的代码:

public class Main {
    public static int solution(int x, int y) {
        // Step 1: Calculate the square of the distance
        double distanceSquared = x * x + y * y;

        // Step 2: Check which ring the point falls into
        for (int i = 1; i <= 10; i++) {
            if (distanceSquared <= i * i) {
                return 11 - i; // Score decreases as ring number increases
            }
        }

        // Step 3: If the point is outside all rings
        return 0;
    }

    public static void main(String[] args) {
        // Test cases
        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. 距离的平方计算
  • 为了避免浮点数的计算误差,这里比较的是距离的平方,而不是直接计算距离。距离平方公式为:

image.png

  • 例如,点 (3, 4)的 d^2=3^2+4^2=25
  1. 环判断逻辑
  • 环的半径平方为 1^2,2^2,......,10^2。将d^2与这些值逐一比较,找到所属的环。
  1. 得分计算
  • 根据公式11 - i,其中i是环的编号,得出得分。
  1. 返回 0 分
  • 如果 d^2 > 100(即 d > 10),返回 0 分。

测试结果

运行以下测试用例:

测试输入 1:

  • x = 1, y = 0
  • d^2 = 1,得分10。

测试输入 2:

  • x = 1, y = 1
  • d^2 = 2,得分9。

测试输入 3:

  • x = 0, y = 5
  • d^2 = 25,得分6。

测试输入 4:

  • x = 3, y = 4
  • d^2 = 25,得分6。

边界测试

  1. 靶心: 输入(0, 0),得分10。
  2. 边界值: 输入(0, 10),得分1。
  3. 超出范围: 输入(11, 0),得分0。

解答感想与总结

在解决这道问题的过程中,我感受到,虽然题目看似简单,但涉及到一些基本的数学知识和编程技巧,比如几何计算、循环判断和代码优化。这种问题在实际开发中可能不直接出现,但其背后的逻辑思维和代码组织方式却是编程的基础能力。

  1. 避免浮点运算误差
    在程序中直接计算距离平方(distance^2)而非实际距离,是一个非常经典的优化方式。这种处理方式不仅节省了计算开销,还有效避免了浮点数运算可能带来的精度问题。这种思维方式在实际开发中也非常有用,特别是处理一些几何图形和坐标相关的问题时。

  2. 从特殊情况入手,逐步分析
    在思考这类问题时,通常会优先考虑特殊情况,比如靶心位置 (0,0) 或极限值 (如距离大于 10)。通过这些测试用例的分析,不仅可以验证算法的正确性,还能发现隐藏的逻辑漏洞。

  3. 问题分解与代码模块化
    整体代码结构清晰,分为三个模块:距离计算、环内判断、返回结果。这种分解方式确保了每一步逻辑的独立性,便于调试和扩展。这提醒我们写代码时,不要一股脑将所有逻辑堆积在一起,而是按照“职责单一”的原则分工明确。

基础知识点总结

  1. 欧几里得距离公式
    欧几里得距离是基础的几何计算公式,常用于判断点与点之间的距离:

image.png

在程序中,为了效率和精度,通常使用距离的平方进行比较:

image.png

  1. 数值范围和边界处理
    在处理坐标问题时,需考虑边界值。比如,点位于圆的边界上时,程序是否能正确处理?超出范围的点是否会正确返回 0 分?这些细节直接影响到算法的正确性。

  2. 循环与条件判断的结合
    题目中用到了一层简单的循环来判断点落在哪个环内。通过循环结合条件判断(if),我们能够快速找到答案。这里的效率高效且直观,适合小规模范围的查询。

  3. 时间复杂度分析
    这段代码的时间复杂度为O(10),即与环数有关。由于环的数量固定(最多 10 个),即使数据量增大,效率仍然可控。类似问题中,如果环数增多(比如百万级),可能需要使用更高效的算法。

个人思考与提升空间

  1. 扩展性思考
    如果题目中增加了其他限制条件,例如不同环的半径不同、或者得分规律变化,该如何调整代码?这提醒我们,虽然当前解法足够简单,但灵活性不高,若条件发生变化,需要重新设计部分逻辑。

  2. 代码优化方向
    这段代码已经足够简洁,但如果想让其更通用,可以将环数和半径作为输入参数,而非硬编码到程序中。这样,算法可以扩展到处理更复杂的环形得分问题。

  3. 学习到的编程技巧

  • 使用平方替代平方根,避免性能开销。
  • 将复杂逻辑分解为简单的循环和条件判断,提高代码可读性。
  • 逐步验证极端测试用例的重要性。

总结

这道题虽然是一个简单的数学模拟问题,但通过解答,我更加理解了数学模型在编程中的应用。无论是几何距离的优化计算,还是逻辑判断的分层处理,都反映了“化繁为简”的思想。同时,这类问题也提醒我们关注细节,比如边界值的处理和极端情况的验证。

编程不只是代码的堆积,更是逻辑的思维和解决问题的能力的体现。这道题看似简单,却对编程思想、数学应用和代码组织都有很好的启发意义。