Link to this code:
https://cses.fi/paste/5bcfa1a6f664c0a9da147e//* 777 */
#include <bits/stdc++.h>
using namespace std;
// up, down, left, right
int DR[4] = {-1, 1, 0, 0};
int DC[4] = {0, 0, -1, 1};
const int MAX_N = 1005, D = 4;
int R, C;
bool vis[MAX_N][MAX_N];
void dfs(int r, int c) {
if (vis[r][c]) return;
vis[r][c] = 1;
for (int i = 0; i < D; ++i) {
dfs(r + DR[i], c + DC[i]);
}
}
void bfs(int sr, int sc) {
queue<pair<int, int>> q;
q.emplace(sr, sc);
vis[sr][sc] = 1;
while (!q.empty()) {
auto [r, c] = q.front();
q.pop();
for (int i = 0; i < D; ++i) {
int nr = r + DR[i], nc = c + DC[i];
if (vis[nr][nc]) continue;
vis[nr][nc] = 1;
q.emplace(nr, nc);
}
}
}
int conn_cmpts(int sr, int sc) {
int cnt = 0;
for (int r = 1; r <= R; ++r) {
for (int c = 1; c <= C; ++c) {
if (vis[r][c]) continue;
cnt++;
// dfs(r, c);
bfs(r, c);
}
}
return cnt;
}
void solve() {
cin >> R >> C;
for (int r = 1; r <= R; ++r) {
for (int c = 1; c <= C; ++c) {
char x;
cin >> x;
vis[r][c] = x == '#';
}
}
for (int r = 0; r <= R + 1; ++r) vis[r][0] = vis[r][C + 1] = 1;
for (int c = 0; c <= C + 1; ++c) vis[0][c] = vis[R + 1][c] = 1;
int cmpts = conn_cmpts(1, 1);
cout << cmpts;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}