#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[2].second == pos[3].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... |