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

97 阅读3分钟

小E的射击训练

问题描述

小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

#include <stdio.h>
#include <math.h>

int solution(int x, int y) 
{
    double distance = sqrt(x * x + y * y);
    if (distance <= 1)
    {
        return 10;
    } 
    else if (distance <= 2)
    {
        return 9;
    } 
    else if (distance <= 3)
    {
        return 8;
    } 
    else if (distance <= 4)
    {
        return 7;
    } 
    else if (distance <= 5)
    {
        return 6;
    } 
    else if (distance <= 6)
    {
        return 5;
    }
    else if (distance <= 7)
    {
        return 4;
    }
    else if (distance <= 8)
    {
        return 3;
    } 
    else if (distance <= 9) 
    {
        return 2;
    } 
    else if (distance <= 10)
    {
        return 1;
    } 
    else 
        return 0;
}

int main()
{
    int x = 0;
    int y = 0;
    scanf("%d%d",&x,&y);
    printf("%d",solution(x,y));  
    return 0;
}

解题思路

问题理解

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

数据结构选择

  • 输入:射击点的坐标(x, y)
  • 输出:射击得分。

算法步骤

  1. 计算距离:首先,计算射击点(x, y)到靶心(0, 0)的距离。这个距离可以通过欧几里得距离公式计算:distance = sqrt(x*x + y*y)

  2. 判断得分:根据计算出的距离,判断射击点在哪个环内,并返回相应的得分。具体步骤如下:

    • 如果distance <= 1,返回10分。
    • 如果distance <= 2,返回9分。
    • 如果distance <= 3,返回8分。
    • 如果distance <= 4,返回7分。
    • 如果distance <= 5,返回6分。
    • 如果distance <= 6,返回5分。
    • 如果distance <= 7,返回4分。
    • 如果distance <= 8,返回3分。
    • 如果distance <= 9,返回2分。
    • 如果distance <= 10,返回1分。
    • 如果distance > 10,返回0分。

总结

通过计算射击点与靶心的距离,并根据距离判断射击点所在的环,可以确定射击得分。这个问题的核心点在于如何根据距离来判断得分,使用一系列的if-else语句可以实现这个逻辑。

优化

上述代码使用了大量的if-else语句来实现,显得代码不简洁,我们可以使用一个数组来存储每个环的得分。数组的索引对应环的半径,数组的值对应得分。通过循环遍历数组,找到第一个满足条件的环,并返回对应的得分。

#include <stdio.h>
#include <math.h>

int solution(int x, int y)
{
    int i = 0; 
    double distance = sqrt(x * x + y * y);
    int scores[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};  // 存储每个环的得分
    int num_rings = sizeof(scores) / sizeof(scores[0]);  // 计算环的数量

    for (i = 0; i < num_rings; i++) 
    {
        if (distance <= i + 1) 
        {
            return scores[i];
        }
    }
    return 0;  // 如果距离大于10,返回0分
}

int main()
{
    int x = 0;
    int y = 0;
    scanf("%d%d",&x,&y);
    printf("%d",solution(x,y));  
    return 0;
}

解释

  • int scores[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};:定义一个数组scores,存储每个环的得分。数组的索引对应环的半径,数组的值对应得分。
  • int num_rings = sizeof(scores) / sizeof(scores[0]);:计算环的数量。
  • for (int i = 0; i < num_rings; i++):循环遍历数组,找到第一个满足条件的环,并返回对应的得分。
  • if (distance <= i + 1):判断距离是否在当前环内。
  • return scores[i];:返回当前环的得分。
  • return 0;:如果距离大于10,返回0分。

优化之后的代码减少了重复,变得更容易维护。