#include<bits/stdc++.h>
using namespace std;
const int N=2002;
int maze[N][N], visited[N][N];
int n,m;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
bool is_inside(pair<int,int>coord)
{
int x=coord.first;
int y=coord.second;
if(x>=0 && x<n && y>=0 && y<m)
{
return true;
}
return false;
}
bool is_safe(pair<int,int>coord)
{
int x= coord.first;
int y = coord.second;
if(maze[x][y]=-1)
{
return false;
}
return true;
}
void bfs(pair<int,int>src)
{
queue<pair<int,int>>q;
visited[src.first][src.second]=1;
q.push(src);
while(!q.empty())
{
pair<int,int>head = q.front();
q.pop();
int x=head.first;
int y = head.second;
for(int i=0;i<4;i++)
{
int new_x=x+dx[i];
int new_y = y+dy[i];
pair<int,int>adj_node = {new_x,new_y};
if(is_inside(adj_node) && is_safe(adj_node) && visited[new_x][new_y]==0)
{
visited[new_x][new_y]=1;
q.push(adj_node);
}
}
}
}
pair<int,int>find_unvisited()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(visited[i][j]==0 && maze[i][j]==0)
{
return{i,j};
}
}
}
return {-1,-1};
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
string input;
cin>>input;
for(int j=0;j<m;j++)
{
if(input[j]=='#')
{
maze[i][j]=-1;
}
}
}
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// {
// cout<<maze[i][j]<<"\t";
// }
// cout<<endl;
// }
// cout<<endl;
int room_cnt = 0;
while(true)
{
pair<int,int>unvisited_pos = find_unvisited();
if(unvisited_pos == pair<int,int>(-1,-1))
{
break;
}
bfs(unvisited_pos);
room_cnt++;
}
cout<<room_cnt<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOPTIwMDI7CmludCBtYXplW05dW05dLCB2aXNpdGVkW05dW05dOwppbnQgbixtOwppbnQgZHhbXT17MCwwLC0xLDF9OwppbnQgZHlbXT17MSwtMSwwLDB9OwoKYm9vbCBpc19pbnNpZGUocGFpcjxpbnQsaW50PmNvb3JkKQp7CiAgICBpbnQgeD1jb29yZC5maXJzdDsKICAgIGludCB5PWNvb3JkLnNlY29uZDsKCiAgICBpZih4Pj0wICYmIHg8biAmJiB5Pj0wICYmIHk8bSkKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKYm9vbCBpc19zYWZlKHBhaXI8aW50LGludD5jb29yZCkKewogICAgaW50IHg9IGNvb3JkLmZpcnN0OwogICAgaW50IHkgPSBjb29yZC5zZWNvbmQ7CgogICAgaWYobWF6ZVt4XVt5XT0tMSkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBiZnMocGFpcjxpbnQsaW50PnNyYykKewogICAgcXVldWU8cGFpcjxpbnQsaW50Pj5xOwogICAgdmlzaXRlZFtzcmMuZmlyc3RdW3NyYy5zZWNvbmRdPTE7CiAgICBxLnB1c2goc3JjKTsKICAgIHdoaWxlKCFxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgcGFpcjxpbnQsaW50PmhlYWQgPSBxLmZyb250KCk7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBpbnQgeD1oZWFkLmZpcnN0OwogICAgICAgIGludCB5ID0gaGVhZC5zZWNvbmQ7CgogICAgICAgIGZvcihpbnQgaT0wO2k8NDtpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgbmV3X3g9eCtkeFtpXTsKICAgICAgICAgICAgaW50IG5ld195ID0geStkeVtpXTsKICAgICAgICAgICAgcGFpcjxpbnQsaW50PmFkal9ub2RlID0ge25ld194LG5ld195fTsKICAgICAgICAgICAgaWYoaXNfaW5zaWRlKGFkal9ub2RlKSAmJiBpc19zYWZlKGFkal9ub2RlKSAmJiB2aXNpdGVkW25ld194XVtuZXdfeV09PTApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZpc2l0ZWRbbmV3X3hdW25ld195XT0xOwogICAgICAgICAgICAgICAgcS5wdXNoKGFkal9ub2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCn0KcGFpcjxpbnQsaW50PmZpbmRfdW52aXNpdGVkKCkgCnsKICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICB7CiAgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKHZpc2l0ZWRbaV1bal09PTAgJiYgbWF6ZVtpXVtqXT09MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJue2ksan07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gey0xLC0xfTsKfQoKCmludCBtYWluKCkKewogICAgY2luPj5uPj5tOwogICAgZm9yKGludCBpPTA7aTxuO2krKykKICAgIHsKICAgICAgICBzdHJpbmcgaW5wdXQ7CiAgICAgICAgY2luPj5pbnB1dDsKCiAgICAgICAgZm9yKGludCBqPTA7ajxtO2orKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKGlucHV0W2pdPT0nIycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1hemVbaV1bal09LTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Ci8vICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCi8vICAgIHsKLy8gICAgICAgIGZvcihpbnQgaj0wO2o8bTtqKyspCi8vICAgICAgICB7Ci8vICAgICAgICAgICAgY291dDw8bWF6ZVtpXVtqXTw8Ilx0IjsKLy8gICAgICAgIH0KLy8gICAgICAgIGNvdXQ8PGVuZGw7Ci8vICAgIH0KLy8gICAgY291dDw8ZW5kbDsKCiAgICBpbnQgcm9vbV9jbnQgPSAwOwogICAgd2hpbGUodHJ1ZSkKICAgIHsKICAgICAgICBwYWlyPGludCxpbnQ+dW52aXNpdGVkX3BvcyA9IGZpbmRfdW52aXNpdGVkKCk7CiAgICAgICAgaWYodW52aXNpdGVkX3BvcyA9PSBwYWlyPGludCxpbnQ+KC0xLC0xKSkKICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBiZnModW52aXNpdGVkX3Bvcyk7CiAgICAgICAgcm9vbV9jbnQrKzsKICAgIH0KICAgIGNvdXQ8PHJvb21fY250PDxlbmRsOwogICAgCiAgICAKCn0K