题目描述
一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个 矩阵中有多少个岛?
举例:
0 0 1 0 1 0
1 1 1 0 1 0
1 0 0 1 0 0
0 0 0 0 0 0
这个矩阵中有三个岛。
思路
从头遍历二维数组,如果当前位置元素为1,则岛数量+1,同时查找此元素上下左右元素(注意边界)是否也为1,如果为1,则将此元素修改为非1值,同时依次去递归查找其上下左右元素是否也满足为1,直至此片岛屿全部修改为非1值为止;
示意图
代码实现
public static int countIsLands(int[][] m) {
if (m == null || m[0] == null) {
return 0;
}
int N = m.length;
int M = m[0].length;
int result = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (m[i][j] == 1) {
result++;
infect(m, i, j, N, M);
}
}
}
return result;
}
private static void infect(int[][] m, int i, int j, int N, int M) {
if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != 1) {
return;
}
m[i][j] = 2;
infect(m, i + 1, j, N, M);
infect(m, i - 1, j, N, M);
infect(m, i, j + 1, N, M);
infect(m, i, j - 1, N, M);
}
测试用例
int[][] m1 = {{0, 0, 0, 0},
{0, 1, 1, 1},
{0, 1, 1, 1},
{0, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 1}};
System.out.println(countIsLands(m1));
int[][] m2 = {{0, 0, 0, 0},
{0, 1, 1, 1},
{0, 1, 1, 1},
{0, 1, 1, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{1, 0, 0, 1}};
System.out.println(countIsLands(m2));
输出结果
2
3
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )