1 条题解
-
0
飞镖游戏计分问题题解
一、题目分析
题目描述了一个飞镖游戏,需要计算两位玩家的得分并判断胜负。关键规则如下:
- 得分区域:从内到外分为5个区域,半径分别为3、6、9、12、15英寸,对应分值为100、80、60、40、20分。
- 计分规则:飞镖落在边界上时计较高分值,落在最外区域外不得分。
- 输入格式:每行12个浮点数,表示两位玩家各3支飞镖的坐标,输入以-100开头的行结束。
- 输出格式:显示得分并判断胜负或平局。
二、算法思路
- 输入处理:逐行读取数据,直到遇到以-100开头的行。
- 距离计算:对每支飞镖,计算其到原点的距离。
- 区域判断:根据距离确定得分区域。
- 胜负判断:比较两位玩家的总得分,输出结果。
三、代码实现
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { vector<int> results; // 存储每局游戏的结果 while(1) { int sum1 = 0; // 玩家1的总得分 int flag = 0; // 标记是否遇到结束标志 // 读取玩家1的3支飞镖 for(int i = 0; i < 3; i++) { double a, b; cin >> a; if((a == -100) && (i == 0)) // 遇到结束标志 { flag = 1; break; } cin >> b; double distance = sqrt(a*a + b*b); // 计算到原点的距离 int score = 0; // 初始化得分为0 // 判断得分区域 if(distance <= 3) { score = 100; } else if(distance <= 6) { score = 80; } else if(distance <= 9) { score = 60; } else if(distance <= 12) { score = 40; } else if(distance <= 15) { score = 20; } sum1 += score; // 累加得分 } if(flag == 1) // 遇到结束标志,退出循环 { break; } // 读取玩家2的3支飞镖(逻辑同玩家1) int sum2 = 0; for(int i = 0; i < 3; i++) { double a, b; cin >> a >> b; double distance = sqrt(a*a + b*b); int score = 0; if(distance <= 3) { score = 100; } else if(distance <= 6) { score = 80; } else if(distance <= 9) { score = 60; } else if(distance <= 12) { score = 40; } else if(distance <= 15) { score = 20; } sum2 += score; } // 将本局结果存入向量 results.push_back(sum1); results.push_back(sum2); } // 输出每局结果 for(int i = 0; i < results.size(); i += 2) { cout << "SCORE: " << results[i] << " to " << results[i+1] << ", "; if(results[i] == results[i+1]) { cout << "TIE." << endl; } else if(results[i] > results[i+1]) { cout << "PLAYER 1 WINS." << endl; } else { cout << "PLAYER 2 WINS." << endl; } } return 0; }
四、代码解释
- 数据结构:使用
vector<int>
存储每局游戏的结果,便于后续输出。 - 输入处理:通过循环读取数据,遇到以-100开头的行时终止。
- 距离计算:使用欧几里得距离公式计算飞镖到原点的距离。
- 区域判断:通过多个
if-else
条件判断飞镖所在区域,确保边界条件正确(落在边界上时计较高分值)。 - 结果输出:遍历结果向量,按指定格式输出每局游戏的得分和胜负情况。
五、复杂度分析
- 时间复杂度:O(n),其中n为游戏局数。每局游戏处理6支飞镖,每支飞镖的处理时间为常数。
- 空间复杂度:O(n),主要用于存储每局游戏的结果。
- 1
信息
- ID
- 1273
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者