一、思路:
求一个图中有多少个连通快即可。当发现一个点是‘W’时,从这个点出发进行dfs,将他附近8个方向上的点都标记为’.’,且又从这个8个方向(必须是‘W’)进行dfs。最终会将一个连通快全部标记为‘.’。标记一个连通块,进行ans++。最后输出有多少个连通块即可。
二、代码:
import java.util.Scanner;
public class POJ_2386 {
static char[][] G = new char[105][105];
static int n, m, ans;
//枚举8个方向 x 代表行 y代表列
static int[] dx = {1,0,0,-1,1,1,-1,-1};
static int[] dy = {0,1,-1,0,1,-1,1,-1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 1; i <= n; i++) {
char[] arr = sc.next().toCharArray();
for (int j = 1; j <= m; j++) {
G[i][j] = arr[j - 1];
}
}
//搜索一下看有几个连通块
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (G[i][j] == 'W') {
dfs(i,j);
ans++;
}
}
}
System.out.println(ans);
}
//将8个方向上的w标记为.
static void dfs(int x, int y) {
G[x][y] = '.';
//枚举下8个方向
for (int i = 0; i < 8; i++) {
int fx = x + dx[i];
int fy = y + dy[i];
if (ok(fx, fy) && G[fx][fy] == 'W') {
dfs(fx,fy);
}
}
}
static boolean ok(int x, int y) {
return x > 0 && x <= n && y > 0 && y <= m;
}
}