P1042 [NOIP2003 普及组] 乒乓球

题目背景

题目描述

华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 11分制和 21 分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中 W 表示华华获得一分, L表示华华对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在 11分制下,此时比赛的结果是华华第一局 11比 0 获胜,第二局 11比 0 获胜,正在进行第三局,当前比分 1 比 1。而在 21 分制下,此时比赛结果是华华第一局 21 比 0 获胜,正在进行第二局,比分 2 比 1。如果一局比赛刚开始,则此时比分为 0 比 0。

到达11分(21分)后,分差大于或者等于 2,才一局结束。

你的程序就是要对于一系列比赛信息的输入(W L 形式),输出正确的结果。

输入格式

每个输入文件包含若干行字符串,字符串有大写的 W 、 L 和 E 组成。其中 E 表示比赛信息结束,程序应该忽略 E 之后的所有内容。

输出格式

输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 11分制下的结果,第二部分是 21 分制下的结果,两部分之间由一个空行分隔。

样例 #1

样例输入 #1

1
2
WWWWWWWWWWWWWWWWWWWW
WWLWE

样例输出 #1

1
2
3
4
5
6
11:0
11:0
1:1

21:0
2:1

提示

每行至多 25 个字母,最多有 2500 行。

(注:事实上有一个测试点有 2501 行数据。)

展开查看代码

#include 
#include 
using namespace std;

int _abs(int x) { return x > 0 ? x : -x; }
void score(int fdif,string& str) { int W = 0, L = 0;//W 华华 L对手 bool wait2 = false;//21:20时等候2分分差 for (int i = 0; i < str.size() - 1; i++) { if (str[i] == 'W')W++; if (str[i] == 'L')L++;
if (W == fdif - 1 && L == fdif - 1)wait2 = true;
if (!wait2) { if (W == fdif) { cout << W << ":" << L << endl; W = L = 0; } else if (L == fdif) { cout << W << ":" << L << endl; W = L = 0; } } else { //等候两分分差 if (_abs(W - L) == 2) { cout << W << ":" << L << endl; W = L = wait2 = 0; } }
} cout << W << ":" << L; }
int main() { string str = ""; char temp;
do { cin >> temp; str += temp; } while (temp != 'E'); if (str == "E") { cout << "0:0\n\n0:0"; goto end; } score(11,str); cout << endl << endl; score(21,str);
end:;
return 0; }

[NOIP2015 普及组] 扫雷游戏

题目描述

扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式

第一行是用一个空格隔开的两个整数 n 和 m,分别表示雷区的行数和列数。

接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符 *}表示相应格子是地雷格,字符 ? 表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式

输出文件包含 n 行,每行 m 个字符,描述整个雷区。用 *表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

样例 #1

样例输入 #1

1
2
3
4
3 3
*??
???
?*?

样例输出 #1

1
2
3
*10
221
1*1

样例 #2

样例输入 #2

1
2
3
2 3
?*?
*??

样例输出 #2

1
2
2*1
*21

提示

对于 100%的数据,1≤n≤100, 1≤m≤100。

展开查看代码

#include 
using namespace std;

char _map[101][101];
int dx[8] = { -1,1,0,0,-1,-1,1,1 }; int dy[8] = { 0,0,-1,1,-1,1,-1,1 }; int main() { int n, m; cin >> n >> m;
for (int x = 1; x <= n; x++) { for (int y = 1; y <= m; y++) { cin >> _map[x][y]; } }
for (int x = 1; x <= n; x++) { if (x != 1) { cout << endl; } for (int y = 1; y <= m; y++) { if (_map[x][y] == '*') { cout << "*"; continue; }
int ans = 0; for (int n = 0; n < 8; n++) { //x , y + 偏移量 if (_map[x + dx[n]][y + dy[n]] == '*') ans++; } cout << ans; } }
return 0; }