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

49 阅读2分钟

为了解决这个问题,我们需要根据射击点 ((x, y)) 到靶心 ((0, 0)) 的距离来确定小E的得分。靶有10个环,靶心位于坐标 ((0, 0)),每个环对应不同的得分,规则如下:

  1. 靶心(半径为1):如果射击点在靶心内(半径小于1),得10分。
  2. 外环:从靶心向外,每个环的得分减少1分:
    • 如果射击点在半径为2的圆内(但大于等于1),得9分。
    • 如果射击点在半径为3的圆内(但大于等于2),得8分。
    • 以此类推,直到:
    • 如果射击点在半径为10的圆内(但大于等于9),得1分。
  3. 脱靶:如果射击点超出所有环(半径大于等于10),得0分。

逐步思考

  1. 计算射击点到靶心的距离

    • 使用欧几里得距离公式计算距离 ( d ): [ d = \sqrt{x^2 + y^2} ]
    • 由于我们只需要比较这个距离与环的半径(整数),我们可以直接比较 ( x^2 + y^2 ) 与环半径的平方,避免计算平方根。
  2. 根据距离确定得分

    • 如果 ( x^2 + y^2 < 1^2 ),得10分。
    • 否则,如果 ( x^2 + y^2 < 2^2 ),得9分。
    • 否则,如果 ( x^2 + y^2 < 3^2 ),得8分。
    • ...
    • 否则,如果 ( x^2 + y^2 < 10^2 ),得1分。
    • 否则,得0分。
  3. 实现

    • 我们可以使用一系列 if-else 语句或循环来检查每个环的条件。

Java 实现

以下是使用上述逻辑编写的 Java 实现:

public class Main {
    public static int solution(int x, int y) {
        // 计算距离的平方
        int distanceSquared = x * x + y * y;
        
        // 根据距离确定得分
        if (distanceSquared < 1 * 1) {
            return 10;
        } else if (distanceSquared < 2 * 2) {
            return 9;
        } else if (distanceSquared < 3 * 3) {
            return 8;
        } else if (distanceSquared < 4 * 4) {
            return 7;
        } else if (distanceSquared < 5 * 5) {
            return 6;
        } else if (distanceSquared < 6 * 6) {
            return 5;
        } else if (distanceSquared < 7 * 7) {
            return 4;
        } else if (distanceSquared < 8 * 8) {
            return 3;
        } else if (distanceSquared < 9 * 9) {
            return 2;
        } else if (distanceSquared < 10 * 10) {
            return 1;
        } else {
            return 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
    }
}

代码解释

  • 距离计算:我们计算距离的平方,以避免使用平方根函数,因为我们只需要将距离与环的半径平方进行比较。
  • 得分逻辑:我们使用一系列 if-else 语句来检查射击点落在哪个环内,并分配相应的得分。
  • 测试:在 main 方法中,我们包含了测试用例,以验证解决方案的正确性。

结论

该解决方案正确地计算了射击得分,根据射击点到靶心的距离,遵循每个环的得分规则。实现简单且高效,确保对于任何给定的坐标 ((x, y)) 都能得到准确的结果。