模拟与高精度
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;
}
 

