\color{Red}{池塘计数——Flood Fill}
这里附带打个广告——————我做的所有的题解
包括基础提高以及一些零散刷的各种各样的题
题目介绍
农夫约翰有一片 N ∗ M 的矩形土地。
最近,由于降雨的原因,部分土地被水淹没了。
现在用一个字符矩阵来表示他的土地。
每个单元格内,如果包含雨水,则用 ”W” 表示,如果不含雨水,则用 ”.” 表示。
现在,约翰想知道他的土地中形成了多少片池塘。
每组相连的积水单元格集合可以看作是一片池塘。
每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。
请你输出共有多少片池塘,即矩阵中共有多少片相连的 ”W” 块。
输入格式
第一行包含两个整数 N 和 M。
接下来 N 行,每行包含 M 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。
输出格式
输出一个整数,表示池塘数目。
数据范围
1 ≤ 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
java 方法1: BFS
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int n, m, N = 1010, M = N * N;
static char[][] g = new char[N][N];
static boolean[][] st = new boolean[N][N];
static PII[] q = new PII[M];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static class PII{
int x, y;
public PII(int x, int y) {
this.x = x;
this.y = y;
}
}
static void bfs(int x, int y){
int hh = 0, tt = 0;
q[0] = new PII(x, y);
//不置true也行,因为我们不遍历当前点
//st[x][y] = true;
while (hh <= tt){
PII t = q[hh++];
int a = t.x;
int b = t.y;
for (int i = a - 1; i <= a + 1; i++) {
for (int j = b - 1; j <= b + 1; j++) {
if (i == a && j == b) continue;
if (i < 1 || i > n || j < 1 || j > m) continue;
if (g[i][j] == '.' || st[i][j]) continue;
q[++tt] = new PII(i, j);
st[i][j] = true;
}
}
}
}
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 1; i <= n; i++) {
char [] c = br.readLine().toCharArray();
for (int j = 1; j <= m; j++)
g[i][j] = c[j - 1];
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == 'W' && !st[i][j]){
bfs(i, j);
cnt ++;
}
}
}
System.out.println(cnt);
}
}
java 方法2:dfs
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeMap;
public class Main {
static int n, m, N = 1010, M = N * N;
static char[][] g = new char[N][N];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static void dfs(int x, int y){
g[x][y] = '.';
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (i == x && j == y) continue;
if (i < 1 || i > n || j < 1 || j > m) continue;
if (g[i][j] == 'W') dfs(i, j);
}
}
}
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 1; i <= n; i++) {
char [] c = br.readLine().toCharArray();
for (int j = 1; j <= m; j++)
g[i][j] = c[j - 1];
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (g[i][j] == 'W'){
dfs(i, j);
cnt ++;
}
}
}
System.out.println(cnt);
}
}