自学内容网 自学内容网

洛谷刷题 P1042 [NOIP2003 普及组] 乒乓球

题目传送:P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

该题主要考察如何模拟这个输赢的过程,其实就是考察字符串数据读取和处理,以及各种情况的总和处理,也就是模拟

那么数据存储我们可以用C++的vector<char>,或者string,如果是C则需要用链表或者足够大的数组存储

对于比分数据,我们可以使用C++中的pair数据类型


    vector<vector<char>> data;    // 记录输入数据
    string input;   // 一次读入一行

    while (cin >> input)
    {
        vector<char> row(input.begin(), input.end());   //string转化为vector并存入
        data.push_back(row);
        if (find(input.begin(), input.end(), 'E') != input.end()) break;    // 如果找到‘E’跳出循环
    }
    
    
    vector<pair<int, int>> z11;  // 记录11制
    vector<pair<int, int>> z21;  // 记录21制

    pair<int, int> z1(0, 0);  // 记录11制一轮
    pair<int, int> z2(0, 0);  // 记录21制一轮

接着我们对二维数据循环访问处理数据,对11制和21制一轮结束情况做讨论,注意if,else if的使用(是并行情况还是多选一情况)

    for (int i = 0; i < data.size(); i++)
    {
        for (int j = 0; j < data[i].size(); j++)
        {
            if (data[i][j] == 'E') // 如果是E,存储剩余结果并结束
            {
                z11.push_back(z1);
                z21.push_back(z2);
                break;
            }
            else if (data[i][j] == 'W') // 如果是W,11制和21制0位都加1
            {
                z1.first += 1;
                z2.first += 1;
            }
            else if (data[i][j] == 'L') // 如果是L,11制和21制1位都加1
            {
                z1.second += 1;
                z2.second += 1;
            }
            if(((z1.first == 11 || z1.second == 11) && (abs(z1.first - z1.second) >=2)) || 
            (z1.first > 11 || z1.second > 11) && (abs(z1.first - z1.second) >=2) ) // 如果分数等于11且超过2分或者分数大于11且超过2分 11制结束一轮,重置z1
    
            {
                z11.push_back(z1);
                z1.first = 0;
                z1.second = 0;
            }
            if(((z2.first == 21 || z2.second == 21) && (abs(z2.first - z2.second) >=2)) || 
            (z2.first > 21 || z2.second > 21) && (abs(z2.first - z2.second) >=2) ) // 如果分数等于21且超过2分或者分数大于21且超过2分 21制结束一轮,重置z2
            {
                z21.push_back(z2);
                z2.first = 0;
                z2.second = 0;
            }
        }
    }

最后输出结果就行 

AC代码

#include<iostream>
#include<utility>
#include<vector>
#include <algorithm>
using namespace std;

int main() 
{
    vector<vector<char>> data;    // 记录输入数据
    string input;   // 一次读入一行

    while (cin >> input)
    {
        vector<char> row(input.begin(), input.end());   //string转化为vector并存入
        data.push_back(row);
        if (find(input.begin(), input.end(), 'E') != input.end()) break;    // 如果找到‘E’跳出循环
    }
    
    
    vector<pair<int, int>> z11;  // 记录11制
    vector<pair<int, int>> z21;  // 记录21制

    pair<int, int> z1(0, 0);  // 记录11制一轮, 0位表示华华赢
    pair<int, int> z2(0, 0);  // 记录21制一轮
    for (int i = 0; i < data.size(); i++)
    {
        for (int j = 0; j < data[i].size(); j++)
        {
            if (data[i][j] == 'E') // 如果是E,存储剩余结果并结束
            {
                z11.push_back(z1);
                z21.push_back(z2);
                break;
            }
            else if (data[i][j] == 'W') // 如果是W,11制和21制0位都加1
            {
                z1.first += 1;
                z2.first += 1;
            }
            else if (data[i][j] == 'L') // 如果是L,11制和21制1位都加1
            {
                z1.second += 1;
                z2.second += 1;
            }
            if(((z1.first == 11 || z1.second == 11) && (abs(z1.first - z1.second) >=2)) || (z1.first > 11 || z1.second > 11) && (abs(z1.first - z1.second) >=2) ) // 如果分数等于11且超过2分或者分数大于11且超过2分 11制结束一轮,重置z1
    
            {
                z11.push_back(z1);
                z1.first = 0;
                z1.second = 0;
            }
            if(((z2.first == 21 || z2.second == 21) && (abs(z2.first - z2.second) >=2)) || (z2.first > 21 || z2.second > 21) && (abs(z2.first - z2.second) >=2) ) // 如果分数等于21且超过2分或者分数大于21且超过2分 21制结束一轮,重置z2
            {
                z21.push_back(z2);
                z2.first = 0;
                z2.second = 0;
            }
        }
    }

    for (int i = 0; i < z11.size(); i++)
    {
        cout << z11[i].first << ":" << z11[i].second << endl;
    }
    cout << endl;
    for (int i = 0; i < z21.size(); i++)
    {
        cout << z21[i].first << ":" << z21[i].second << endl;
    }
    return 0;
}

 


原文地址:https://blog.csdn.net/Kenjuan/article/details/142718843

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!