为了解决这个问题,我们需要根据射击点 ((x, y)) 到靶心 ((0, 0)) 的距离来确定小E的得分。靶有10个环,靶心位于坐标 ((0, 0)),每个环对应不同的得分,规则如下:
- 靶心(半径为1):如果射击点在靶心内(半径小于1),得10分。
- 外环:从靶心向外,每个环的得分减少1分:
- 如果射击点在半径为2的圆内(但大于等于1),得9分。
- 如果射击点在半径为3的圆内(但大于等于2),得8分。
- 以此类推,直到:
- 如果射击点在半径为10的圆内(但大于等于9),得1分。
- 脱靶:如果射击点超出所有环(半径大于等于10),得0分。
逐步思考
-
计算射击点到靶心的距离:
- 使用欧几里得距离公式计算距离 ( d ): [ d = \sqrt{x^2 + y^2} ]
- 由于我们只需要比较这个距离与环的半径(整数),我们可以直接比较 ( x^2 + y^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分。
-
实现:
- 我们可以使用一系列
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)) 都能得到准确的结果。