import java.util.*;
public class Solution149 {
static int sum;
static int m;
static int n;
static int[][] map;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
m = scanner.nextInt();
n = scanner.nextInt();
map = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = scanner.nextInt();
}
}
scanner.close();
// 将水面标记为-1
for (int i = 0; i < n; i++) {
if (map[0][i] == 0) {
merge(0, i, 0, -1);
}
}
for (int i = 0; i < m; i++) {
if (map[i][0] == 0) {
merge(i, 0, 0, -1);
}
if (map[i][n - 1] == 0) {
merge(i, n - 1, 0, -1);
}
}
// 剩下的都是陆地
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 0) {
map[i][j] = 1;
}
}
}
// 计算陆地面积
sum = 0;
merge(m - 1, 0, 1, 2);
System.out.println(sum);
}
public static void merge(int i, int j, int key, int set) {
if (i < 0 || i >= m || j < 0 || j >= n || map[i][j] != key) {
return;
}
sum++;
map[i][j] = set;
merge(i + 1, j, key, set);
merge(i - 1, j, key, set);
merge(i, j + 1, key, set);
merge(i, j - 1, key, set);
}
}
这里,我自己再出一个题,1为陆地,被水面包围的称为岛屿,同时求岛屿的个数和最大岛屿的面积。
代码:
import java.util.*;
public class Main {
static int n;
static int m;
static int[][] map;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
map = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = scanner.nextInt();
}
}
scanner.close();
int count = 0;
int max = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == 1) {
count++;
max = Math.max(max, dfs(i, j, 1, 2));
}
}
}
System.out.println("岛屿的个数:" + count);
System.out.println("最大岛屿的面积:" + max);
}
public static int dfs(int i, int j, int key, int set) {
if (i < 0 || i >= n || j < 0 || j >= m || map[i][j] != key) {
return 0;
}
map[i][j] = set;
return 1 + dfs(i + 1, j, key, set) + dfs(i - 1, j, key, set) + dfs(i, j + 1, key, set)
+ dfs(i, j - 1, key, set);
}
}
结果: