1 条题解

  • 0
    @ 2026-6-19 10:30:21

    📝 题目大意

    给定一个 H×WH \times W 的字符网格,每个格子为 #(有棋子)或 .(空)。统计所有格子中 # 的数量。

    💡 解题思路

    1. 题目分析H,W10H, W \leq 10,数据规模极小,直接暴力遍历即可。字符仅包含 #.,只需统计 # 出现次数。
    2. 算法推导
      • 读入 HHWW
      • 使用 map<char, int>(变量 mp)记录每个字符的出现次数;
      • 遍历 HH 行,每行读入字符串 ss,再遍历每个字符 s[j],令 mp[s[j]]++
      • 最终输出 mp['#'],即 # 的出现总次数。
    3. 边界与细节
      • 当没有 # 时,mp['#'] 默认值为 00map 的未访问键值自动初始化为 00),输出 00 正确。
      • H,WH, W 最小为 11,不存在空输入情况。

    ⏱️ 复杂度分析

    • 时间复杂度O(H×WlogΣ)O(H \times W \log \Sigma),其中 Σ=2\Sigma = 2(字符集仅含 #.),实际上 logΣ\log \Sigma 可视为常数。由于 H,W10H, W \leq 10,遍历量极小。
    • 空间复杂度O(Σ)O(\Sigma)map 仅存储两个键值对。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        map<char,int> mp;   // 统计每个字符出现的次数
        int w, h;
        string s;
        cin >> h >> w;      // 读入行数 H 和列数 W
        for (int i = 0; i < h; i++) {
            cin >> s;       // 读入第 i 行
            for (int j = 0; j < w; j++) {
                mp[s[j]]++; // 统计当前字符
            }
        }
        cout << mp['#'];    // 输出 '#' 的数量
    }
    
    • 1

    信息

    ID
    657
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者