农夫约翰有一片 N∗MN∗M 的矩形土地。
最近,由于降雨的原因,部分土地被水淹没了。
现在用一个字符矩阵来表示他的土地。
每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。
现在,约翰想知道他的土地中形成了多少片池塘。
每组相连的积水单元格集合可以看作是一片池塘。
每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。
请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。

输入格式

第一行包含两个整数 NN 和 MM。
接下来 NN 行,每行包含 MM 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。

输出格式

输出一个整数,表示池塘数目。

数据范围

1≤N,M≤10001≤N,M≤1000

输入样例:

10 12 W……..WW. .WWW…..WWW ….WW…WW. ………WW. ………W.. ..W……W.. .W.W…..WW. W.W.W…..W. .W.W……W. ..W…….W.

输出样例:

3


  1. import java.util.*;
  2. import java.io.*;
  3. public class Main {
  4. static BufferedReader cin = new BufferedReader(new InputStreamReader(System. in));
  5. static int n,m;
  6. static char[][] arr;
  7. private static void bfs (int sx, int sy) {
  8. Deque<int[]> queue = new ArrayDeque<>();
  9. queue.addFirst(new int[]{sx,sy});
  10. while (!queue.isEmpty()) {
  11. int[] t = queue.pollFirst();
  12. int x = t[0], y = t[1];
  13. for (int i = x-1; i <= x+1; ++i)
  14. for (int j = y-1; j <= y+1; ++j) {
  15. if (i < 0 || i > n-1 || j < 0 || j > m-1) continue;
  16. if (i == sx && j == sy) continue;
  17. if (arr[i][j] == '.') continue;
  18. queue.addFirst(new int[]{i,j});
  19. arr[i][j] = '.';
  20. }
  21. }
  22. }
  23. public static void main(String args[]) throws IOException {
  24. String[] s = cin.readLine().split(" ");
  25. n = Integer.parseInt(s[0]);
  26. m = Integer.parseInt(s[1]);
  27. arr = new char[n][m];
  28. for (int i = 0; i < n; ++i) {
  29. String str = cin.readLine();
  30. for (int j = 0; j < m; ++j)
  31. arr[i][j] = str.charAt(j);
  32. }
  33. int res = 0;
  34. for (int i = 0; i < n; ++i)
  35. for (int j = 0; j < m; ++j)
  36. if (arr[i][j] == 'W') {
  37. bfs(i,j);
  38. res++;
  39. }
  40. System.out.println(res);
  41. }
  42. }