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

61 阅读3分钟

问题描述

小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。

根据给定的射击坐标(x, y),请计算小E的射击得分。

测试样例

样例1:

输入:x = 1, y = 0
输出:10

样例2:

输入:x = 1, y = 1
输出:9

样例3:

输入:x = 0, y = 5
输出:6

样例4:

输入:x = 3, y = 4
输出:6

解题过程及代码详解

问题理解

小E在射击练习中,靶心位于坐标 (0, 0),靶有10个环,每个环对应不同的得分。靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为 i 的圆内,则得 11-i 分。如果射击点超出所有的环,则得0分。

我们需要根据给定的射击坐标 (x, y) 计算小E的射击得分。

数据结构选择

在这个问题中,我们不需要复杂的数据结构。我们只需要计算射击点到靶心的距离,并根据距离确定得分。

算法步骤

计算射击点到靶心的距离:

使用欧几里得距离公式:distance = sqrt(x^2 + y^2)。 确定得分:

如果距离小于等于1,得分是10分。 如果距离大于1且小于等于2,得分是9分。 以此类推,直到距离大于10,得分是0分。 返回得分:

根据计算的距离,返回相应的得分。

代码实现

public class Main {
    public static int solution(int x, int y) {
        // write code here
        double r = Math.sqrt(x*x + y*y);
        if(r > 10){return 0;}
        else{return (int)(11-r);}
        //return 0;
    }

    public static void main(String[] args) {
        System.out.println(solution(1, 0) == 10);
        System.out.println(solution(1, 1) == 9);
        System.out.println(solution(0, 5) == 6);
        System.out.println(solution(3, 4) == 6);
    }
}

代码详解

①计算距离的平方:

int distanceSquared = x * x + y * y; 这里我们计算了射击点到靶心的距离的平方,避免了直接计算平方根,因为平方根计算相对较慢。

②计算距离:

double distance = Math.sqrt(distanceSquared); 这里我们计算了实际的距离,用于后续的得分判断。

③根据距离确定得分:

我们使用一系列的 if-else 语句来判断距离,并返回相应的得分。 例如,如果距离小于等于1,返回10分;如果距离大于1且小于等于2,返回9分,以此类推。

④测试样例:

在 main 方法中,我们提供了一些测试样例来验证代码的正确性。 每个测试样例都打印出结果,并与预期结果进行比较,确保代码的正确性。

总结

通过上述详细的解题过程和代码实现,我们可以看到如何逐步解决这个问题。我们从问题理解开始,选择合适的数据结构和算法,然后实现代码并进行优化。最终,我们得到了一个高效且简洁的解决方案。