模拟与高精度
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 |
|
样例输出 #1
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 |
|
样例输出 #1
1 |
|
样例 #2
样例输入 #2
1 |
|
样例输出 #2
1 |
|
提示
对于 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;
}