#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e3 + 5;
/* trái - phải - lên - xuống */
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
int n, m;
string s[N];
bool vis[N][N]; // vis[x][y]: ô (x, y) đã được thăm hay chưa
// Check ô (x, y) có nằm trong bảng và là ô trống
bool ok(int x, int y) {
return (0 <= x && x < n && 0 <= y && y < m && s[x][y] == '.');
}
void bfs(int sx, int sy) {
queue<ii> q;
vis[sx][sy] = true;
q.push({sx, sy});
while (!q.empty()) {
ii u = q.front(); q.pop();
int x = u.first, y = u.second;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (ok(nx, ny) && !vis[nx][ny]) {
vis[nx][ny] = true;
q.push({nx, ny});
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int x = 0; x < n; x++) cin >> s[x];
memset(vis, 0, sizeof vis);
int ans = 0; // Số thành phần liên thông
for (int x = 0; x < n; x++) {
for (int y = 0; y < m; y++) {
if (s[x][y] == '.' && !vis[x][y]) {
ans++;
bfs(x, y);
}
}
}
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTMgKyA1OyAKCi8qIHRyw6FpIC0gcGjhuqNpIC0gbMOqbiAtIHh14buRbmcgKi8gCmludCBkeFs0XSA9IHswLCAwLCAtMSwgMX07IAppbnQgZHlbNF0gPSB7LTEsIDEsIDAsIDB9OyAgCgppbnQgbiwgbTsgIApzdHJpbmcgc1tOXTsgIAoKYm9vbCB2aXNbTl1bTl07IC8vIHZpc1t4XVt5XTogw7QgKHgsIHkpIMSRw6MgxJHGsOG7o2MgdGjEg20gaGF5IGNoxrBhIAoKLy8gQ2hlY2sgw7QgKHgsIHkpIGPDsyBu4bqxbSB0cm9uZyBi4bqjbmcgdsOgIGzDoCDDtCB0cuG7kW5nCmJvb2wgb2soaW50IHgsIGludCB5KSB7CglyZXR1cm4gKDAgPD0geCAmJiB4IDwgbiAmJiAwIDw9IHkgJiYgeSA8IG0gJiYgc1t4XVt5XSA9PSAnLicpOyAKfQoKdm9pZCBiZnMoaW50IHN4LCBpbnQgc3kpIHsKCXF1ZXVlPGlpPiBxOyAKCgl2aXNbc3hdW3N5XSA9IHRydWU7ICAKCXEucHVzaCh7c3gsIHN5fSk7ICAKCgl3aGlsZSAoIXEuZW1wdHkoKSkgewoJCWlpIHUgPSBxLmZyb250KCk7IHEucG9wKCk7ICAKCQlpbnQgeCA9IHUuZmlyc3QsIHkgPSB1LnNlY29uZDsgIAoKCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewoJCQlpbnQgbnggPSB4ICsgZHhbaV0sIG55ID0geSArIGR5W2ldOyAgCgoJCQlpZiAob2sobngsIG55KSAmJiAhdmlzW254XVtueV0pIHsKCQkJCXZpc1tueF1bbnldID0gdHJ1ZTsgIAoJCQkJcS5wdXNoKHtueCwgbnl9KTsgCgkJCX0KCQl9Cgl9Cn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IG07ICAKCglmb3IgKGludCB4ID0gMDsgeCA8IG47IHgrKykgY2luID4+IHNbeF07IAoJCQoJbWVtc2V0KHZpcywgMCwgc2l6ZW9mIHZpcyk7ICAKCglpbnQgYW5zID0gMDsgLy8gU+G7kSB0aMOgbmggcGjhuqduIGxpw6puIHRow7RuZyAKCWZvciAoaW50IHggPSAwOyB4IDwgbjsgeCsrKSB7CgkJZm9yIChpbnQgeSA9IDA7IHkgPCBtOyB5KyspIHsKCQkJaWYgKHNbeF1beV0gPT0gJy4nICYmICF2aXNbeF1beV0pIHsKCQkJCWFucysrOyAKCQkJCWJmcyh4LCB5KTsgCgkJCX0KCQl9Cgl9CgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=