1 条题解

  • 0
    @ 2025-5-27 20:59:22

    飞镖游戏计分问题题解

    一、题目分析

    题目描述了一个飞镖游戏,需要计算两位玩家的得分并判断胜负。关键规则如下:

    1. 得分区域:从内到外分为5个区域,半径分别为3、6、9、12、15英寸,对应分值为100、80、60、40、20分。
    2. 计分规则:飞镖落在边界上时计较高分值,落在最外区域外不得分。
    3. 输入格式:每行12个浮点数,表示两位玩家各3支飞镖的坐标,输入以-100开头的行结束。
    4. 输出格式:显示得分并判断胜负或平局。

    二、算法思路

    1. 输入处理:逐行读取数据,直到遇到以-100开头的行。
    2. 距离计算:对每支飞镖,计算其到原点的距离。
    3. 区域判断:根据距离确定得分区域。
    4. 胜负判断:比较两位玩家的总得分,输出结果。

    三、代码实现

    #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;
    }
    

    四、代码解释

    1. 数据结构:使用vector<int>存储每局游戏的结果,便于后续输出。
    2. 输入处理:通过循环读取数据,遇到以-100开头的行时终止。
    3. 距离计算:使用欧几里得距离公式计算飞镖到原点的距离。
    4. 区域判断:通过多个if-else条件判断飞镖所在区域,确保边界条件正确(落在边界上时计较高分值)。
    5. 结果输出:遍历结果向量,按指定格式输出每局游戏的得分和胜负情况。

    五、复杂度分析

    • 时间复杂度:O(n),其中n为游戏局数。每局游戏处理6支飞镖,每支飞镖的处理时间为常数。
    • 空间复杂度:O(n),主要用于存储每局游戏的结果。
    • 1

    信息

    ID
    1273
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者