#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=105; // 数组大小(因为n,m≤100,开105留边界)
// 全局变量:存储地图、访问标记、八方向偏移
char g[N][N]; // g[i][j]:存储地图的字符(W/.),用'0'填充边界防止越界
bool b[N][N]; // b[i][j]:标记该格子是否被访问过(避免重复处理同一岛屿)
// 八方向偏移数组(对应:右下、右、右上、下、上、左下、左、左上)
ll dx[]={1,1,1,0,0,-1,-1,-1};
ll dy[]={1,0,-1,1,-1,1,0,-1};
// 算法核心:DFS(深度优先搜索)—— 标记当前W所在的整个连通岛屿
// 思想:从当前W格子出发,递归遍历所有八连通的W格子,标记为已访问
void dfs(ll i, ll j){
b[i][j] = true; // 第一步:标记当前格子为已访问(避免重复处理)
// (冗余判断:因为main中只有g[i][j]是W才会调用DFS,这里可省略)
if(g[i][j] == '.') return;
// 遍历当前格子的8个相邻方向
for(ll k=0; k<8; k++){
// 计算相邻格子的坐标
ll x = i + dx[k];
ll y = j + dy[k];
// 合法条件:①未被访问过 ②不是边界(g[x][y]!='0',因为边界初始化为'0')
if(b[x][y] == false && g[x][y] != '0'){
dfs(x, y); // 递归处理相邻的W格子(标记整个连通块)
}
}
}
int main() {
// 步骤1:输入地图尺寸n(行)、m(列)
ll n, m;
cin >> n >> m;
// 步骤2:初始化地图边界为'0'(避免DFS时越界访问)
memset(g, '0', sizeof g);
// 步骤3:输入地图数据(从第1行第1列开始存储,留边界)
for(ll i=1; i<=n; i++){
for(ll j=1; j<=m; j++){
cin >> g[i][j];
}
}
// 步骤4:遍历所有格子,统计W岛屿数量
ll res = 0; // res:记录W岛屿的总数
for(ll i=1; i<=n; i++){
for(ll j=1; j<=m; j++){
// 触发条件:当前格子是W + 未被访问过(说明是新岛屿的起点)
if(b[i][j] == false && g[i][j] == 'W'){
res++; // 新岛屿,计数+1
dfs(i, j); // 调用DFS标记这个岛屿的所有连通格子
}
}
}
// 步骤5:输出最终的W岛屿数量
cout << res;
return 0;
}