小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)。 - 输出:射击得分。
算法步骤
-
计算距离:首先,计算射击点
(x, y)到靶心(0, 0)的距离。这个距离可以通过欧几里得距离公式计算:distance = sqrt(x*x + y*y)。 -
判断得分:根据计算出的距离,判断射击点在哪个环内,并返回相应的得分。具体步骤如下:
- 如果
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分。
优化之后的代码减少了重复,变得更容易维护。