算法题解:岛屿的数量(JAVA代码)
给定一个二维数组,数组元素由0和1组成。0代表水,1代表陆地。陆地可以形成岛。
如果上下左右,包括对角线方向如有相邻的陆地(1)则可以形成岛。如下图所示。
编写一个算法,求岛的数量。
例如:规定一个二维数组:
{1, 1, 0, 0, 0},
{0, 1, 0, 0, 1},
{1, 0, 0, 1, 1},
{0, 0, 0, 0, 0},
{1, 0, 1, 0, 1}
根据这个二维数组,岛的划分如下图所示,可以划分为5个岛屿。
算法分析
注意:这个问题需要检索8个方向。
与之前不同的是,之前陆地(1)的相邻不包含对角线的4个方向,只能水平方向或者垂直方向。
这是标准问题的一个变化:“计算无向图中连接组件的数量”。最常见的算法设计思想是采用DFS算法,给出一个解。
其实,也可以使用不相交集数据结构来解决这个问题。其思想是将所有“1”的单元格都视为单个集。遍历矩阵并对所有相邻的1个顶点进行并集。
算法设计
package com.bean.algorithmbasic;
/*
* 这个题目在0-1矩阵中寻找岛的数量时,是向8个方向检索。
* 不同之前只能