/**
* TODO
*
* @author
* @version 1.0
* @date 2022/3/26 17:22
* 有一个大小为 N*M 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出
* 园子里总共有多少水洼?(八连通指的是下图中相对 W 的*的部分)
* <p>
* ***
* *W*
* ***
* <p>
* 限制条件
* <p>
* N, M ≤ 100
* <p>
* 样例:
* <p>
* 输入
* N=10, M=12
* <p>
* 园子如下图('W'表示积水, '.'表示没有积水)
* <p>
* W........WW.
* .WWW.....WWW
* ....WW...WW.
* .........WW.
* .........W..
* ..W......W..
* .W.W.....WW.
* W.W.W.....W.
* .W.W......W.
* ..W.......W.
* <p>
* 输出
* <p>
* 3
*/
public class Case7_水洼数 {
static int n;
static int m;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
char[][] c = new char[n][];
for (int i = 0; i < n; i++) {
c[i] = scanner.next().toCharArray();
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (c[i][j] == 'W') {
dfs(c, i, j);//清除水洼
cnt++;
}
}
}
System.out.println(cnt);
}
/**
* Case7_水洼数
* <p>
* 使用回溯 八个方向进行检测
* 在检测过的点之后 进行标记,防止无限循环
* 知道周围都没有,退出
*
* @param
* @return
*/
private static void dfs(char[][] c, int i, int j) {
c[i][j] = '.';
// 八个方向全都包括
for (int k = -1; k < 2; k++) { //-1,0,1
for (int l = -1; l < 2; l++) { //-1,0,1
if (k == 0 && l == 0) continue;
if (i + k >= 0 && i + k <= n - 1 && j + l >= 0 && j + l <= m - 1) {
if (c[i + k][j + l] == 'W') {
dfs(c, i + k, j + l);
}
}
}
}
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交