题目
有一个二维数组,其中每个元素要么是1或者0,1表示土地,连起来的1表示一个岛屿,0表示海,请计算出来二维数组用有多少个岛屿
比如:
{ { 1, 1, 1, 0, 1}, {0, 1, 0, 1, 0}, { 1, 0, 1, 1, 1}, { 1, 1, 0, 1, 0}};
可以看出这二维数组中有四个岛屿
解题
通过深度优先来做,遍历过的需要做标记,碰到1开始递归标记相邻的1,碰到0就return
public class NumIslandsTest {
public static void main(String[] args) {
int[][] dots = {
{1, 0, 1, 0, 1}, {0, 1, 0, 1, 0}, {1, 0, 1, 0, 1}, {0, 1, 0, 1, 0}};
int num = getNumIslands(dots);
System.out.println(num);
}
private static int getNumIslands(int[][] dots) {
int result = 0;
for (int i = 0; i < dots.length; i++) {
for (int j = 0; j < dots[i].length; j++) {
if (dots[i][j] == 1) {
result++;
mark(dots, i, j);
}
}
}
return result;
}
private static void mark(int[][] dots, int i, int j) {
int iMax = dots.length;
int jMax = dots[0].length;
if (i >= iMax || j >= jMax || i < 0 || j < 0) {
return;
}
if (dots[i][j] != 1) {
return;
}
dots[i][j] = 2;
mark(dots, i - 1, j);
mark(dots, i, j + 1);
mark(dots, i + 1, j);
mark(dots, i, j - 1);
}
}