#include <iostream>
#define MAX_N 110
int N,M;
char field[MAX_N][MAX_N];//创建园子
using namespace std;
void dfs(int x,int y)
{
field[x][y]='.';//把现在的位置改为.
//循环遍历移动的八个方向
for(int dx=-1; dx<=1; dx++)
{
for(int dy=-1; dy<=1; dy++)
{
//向x方向移动dx,向y方向移动dy,移动的结果为(nx,ny)
int nx=x+dx;
int ny=y+dy;
//判断(nx,ny)是不是在园子里面,以及是否有积水。
if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny]=='W')
{
dfs(nx,ny);
}
}
}
}
int main()
{
int ans=0;
cin >> N >> M;
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
cin >> field[i][j];
}
}
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
if(field[i][j]=='W')
{
//从有w的地方开始dfs
dfs(i,j);
ans++;
}
}
}
cout << ans << endl;
return 0;
}
#define MAX_N 110
int N,M;
char field[MAX_N][MAX_N];//创建园子
using namespace std;
void dfs(int x,int y)
{
field[x][y]='.';//把现在的位置改为.
//循环遍历移动的八个方向
for(int dx=-1; dx<=1; dx++)
{
for(int dy=-1; dy<=1; dy++)
{
//向x方向移动dx,向y方向移动dy,移动的结果为(nx,ny)
int nx=x+dx;
int ny=y+dy;
//判断(nx,ny)是不是在园子里面,以及是否有积水。
if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny]=='W')
{
dfs(nx,ny);
}
}
}
}
int main()
{
int ans=0;
cin >> N >> M;
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
cin >> field[i][j];
}
}
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
if(field[i][j]=='W')
{
//从有w的地方开始dfs
dfs(i,j);
ans++;
}
}
}
cout << ans << endl;
return 0;
}