#include <bits/stdc++.h>
using namespace std;
int check1(vector<pair<int, int>> &pos) {
    set<int> x, y;
    for (int i = 0; i < 4; i++) {
        x.insert(pos[i].first);
        y.insert(pos[i].second);
    }
    if (x.size() == 2 && y.size() == 2) return 1;
    return 0;
}
int check2(vector<pair<int, int>> &pos) {
    set<int> x, y;
    for (int i = 0; i < 4; i++) {
        x.insert(pos[i].first);
        y.insert(pos[i].second);
    }
    if ((x.size() == 1 && y.size() == 4) || (x.size() == 4 && y.size() == 1)) return 1;
    return 0;
}
int check3(vector<pair<int, int>> &pos) {
    /*
         XX   or    X
        XX          XX
                     X
    */
    if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second && 
        pos[0].first == pos[2].first && pos[0].second == pos[2].second-1 &&
        pos[1].first == pos[3].first && pos[1].second == pos[3].second+1) return 1;
    
    if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second &&
        pos[1].first == pos[2].first && pos[1].second == pos[2].second-1 &&
        pos[2].first == pos[3].first-1 && pos[1].second == pos[2].second) return 1;
    
    return 0;
}
int check4(vector<pair<int, int>> &pos) {
    /*
        XX    or    X
         XX        XX
                   X
    */
    if (pos[0].first == pos[1].first && pos[0].second == pos[1].second-1 &&
        pos[1].first == pos[2].first-1 && pos[1].second == pos[2].second &&
        pos[2].first == pos[3].first && pos[2].second == pos[3].second-1) return 1;
    if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second &&
        pos[1].first == pos[2].first && pos[1].second == pos[2].second+1 &&
        pos[2].first == pos[3].first-1 && pos[2].second == pos[3].second) return 1;
    return 0;
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<char>> grid(n+2, vector<char>(m+2));
    fill(grid[0].begin(), grid[0].end(), '.');
    fill(grid[n+1].begin(), grid[n+1].end(), '.');
    for (int i = 1; i <= n; i++) {
        grid[i][0] = '.';
        grid[i][m+1] = '.';
        for (int j = 1; j <= m; j++) cin >> grid[i][j];
    }
    vector<int> ans(6);
    vector<vector<bool>> visited(n+2, vector<bool>(m+2));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (visited[i][j]) continue;
            if (grid[i][j] == '.') continue;
            queue<pair<int, int>> q;
            q.push({i, j});
            vector<pair<int, int>> pos;
            while (!q.empty()) {
                int r = q.front().first, c = q.front().second;
                q.pop();
                pos.push_back({r, c});
                visited[r][c] = true;
                if (!visited[r+1][c] && grid[r+1][c] == grid[i][j]) {
                    q.push({r+1, c});
                    visited[r+1][c] = true;
                }
                if (!visited[r-1][c] && grid[r-1][c] == grid[i][j]) {
                    q.push({r-1, c});
                    visited[r-1][c] = true;
                }
                if (!visited[r][c+1] && grid[r][c+1] == grid[i][j]) {
                    q.push({r, c+1});
                    visited[r][c+1] = true;
                }
                if (!visited[r][c-1] && grid[r][c-1] == grid[i][j]) {
                    q.push({r, c-1});
                    visited[r][c-1] = true;
                }
            }
            if (check1(pos)) ans[1]++;
            else if (check2(pos)) ans[2]++;
            else if (check3(pos)) ans[3]++;
            else if (check4(pos)) ans[4]++;
            else ans[5]++;
        }
    }
    cout << ans[1] << '\n' << ans[2] << '\n' << ans[3] << '\n' << ans[4] << '\n' << ans[5] << '\n';
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |