洛谷刷题 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)!