题目描述
dfs 或 直接
dfs
import java.util.*;
public class Main {
//dx和dy代表偏移量数组 用来枚举左上右下四个方向
static final int[] dx = {-1, 0, 1, 0};
static final int[] dy = {0, 1, 0, -1};
static int N = 105;
static int n;
static int m;
//存图
static char[][] g = new char[N][N];
//判断每个点有没有被搜过
static boolean[][] st = new boolean[N][N];
static int count = 0;
static void dfs(int x, int y) {
//当前点被搜过 被设为true
//st[x][y] = true;
g[x][y] = '.';
//count++ //统计连通块的点数
for(int i = 0 ; i < 4 ; i++){
int a = x + dx[i];
int b = y + dy[i];
//该点没越界,该点没被扫过
if (a >= 0 && a < n && b >= 0 && b < m && !st[a][b]){
if(g[a][b] == '.') {
continue;
}else {
dfs(a, b);//继续扫这个点
}
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
int res = 0;
//当你使用 nextInt()等方法读取基本类型时,输入缓冲区中的换行符可能会留在缓冲区中,
//如果不消耗这个换行符,后续的 nextLine() 将会读取到一个空行。
//因此,在读取完整数后,调用scanner.nextLine().
//可以确保输入缓冲区中的换行符被消耗掉,以便后续的 nextLine() 可以正常读取下一行的输入。
scanner.nextLine();
for (int i = 0; i < n; i++) {
String line = scanner.nextLine();
for (int j = 0; j < m; j++) {
g[i][j] = line.charAt(j);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
//如果当前点为B,且这个点没被搜过
// if (g[i][j] == 'B' && !st[i][j]) {
// //就搜一下这个点(也就是找这个点所在的联通块)
// dfs(i, j);
// res++;
// }
if (g[i][j] == 'B') {
res++;
//就搜一下这个点(也就是找这个点所在的联通块)
dfs(i, j);
}
}
}
System.out.println(res);
}
}
直接枚举
blablabla