朋友刚刚学完java,回来说面试喊他现场写计算岛屿个数的算法,当时时间紧脑袋短路没有写出来。
##问题
在一个地图中,找出一共有多少个岛屿。
我们用一个二维数组表示这个地图,地图中的 1 表示陆地,0 表示水域。一个岛屿是指由上下左右相连的陆地,并且被水域包围的区域。
你可以假设地图的四周都是水域。
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1 },
比如这种情况,期望输出结果为4。
##java逻辑实现
public class Test {
static int daoyu[][] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1 },
};
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < daoyu.length; i++)
for (int j = 0; j < daoyu[i].length; j++)
if (daoyu[i][j] == 1) {
count++;
lj(i, j);
}
System.out.println("岛屿数量为:" + count);
}
//递归修改附近数值
static void lj(int i, int j) {
daoyu[i][j] = 2;
// 上边
if (i - 1 >= 0 && daoyu[i - 1][j] == 1)
lj(i - 1, j);
// 下边
if (i + 1 < daoyu.length && daoyu[i + 1][j] == 1)
lj(i + 1, j);
// 左边
if (j - 1 >= 0 && daoyu[i][j - 1] == 1)
lj(i, j - 1);
// 右边
if (j + 1 < daoyu[i].length && daoyu[i][j + 1] == 1)
lj(i , j + 1);
}
}
运行结果:
岛屿数量为:4