给定一个二维的 0-1 矩阵,其中 0 表示海洋,1 表示陆地。单独的或相邻的陆地可以形成岛屿,每个格子只与其上下左右四个格子相邻。求最大的岛屿面积。
function func(arr) {
/**
* 四个方位
* (-1, 0)左、(0, 1)上、(1, 0)右、(0, -1)下
*/
const nums = [ -1, 0, 1, 0, -1 ];
const rows = arr.length;
const cols = arr[0].length;
// 最大的陆地面积
let max_area = 0;
// 当前的陆地面积
let cur_area = 0;
for (let i = 0; i < rows; ++i) {
for (let j = 0; j < cols; ++j) {
// 如果是陆地
if (arr[i][j]) {
// 当前陆地面积加一,并设置为 0 表示已计算过该区域
cur_area = 1;
arr[i][j] = 0;
// 记录当前的坐标位置
let stack = [{ x: i, y: j }];
while (stack.length) {
const { x: xx, y: yy } = stack.pop();
// 当前坐标尝试向四个方位拓展
for (let k = 0; k < 4; ++k) {
const a = xx + nums[k];
const b = yy + nums[k + 1];
// 如果新坐标符合要求,当前陆地面积加一
if (a >= 0 && a < rows
&& b >= 0 && b < cols
&& arr[a][b] == 1) {
++cur_area;
arr[a][b] = 0;
stack.push({ x: a, y: b });
}
}
}
max_area = Math.max(max_area, cur_area);
}
}
}
return max_area;
}
const arr = [
[ 1, 0, 1, 1, 0, 1, 0, 1 ],
[ 1, 0, 1, 1, 0, 1, 1, 1 ],
[ 0, 0, 0, 0, 0, 0, 0, 1 ]
];
const result = func(arr);
console.log(result);
function func(arr) {
/**
* 四个方位
* (-1, 0)左、(0, 1)上、(1, 0)右、(0, -1)下
*/
const nums = [-1, 0, 1, 0, -1];
const rows = arr.length;
const cols = arr[0].length;
let max_area = 0;
const _getMaxArea = (arr, i, j) => {
// 当前陆地面积加一并标记为已计算
arr[i][j] = 0;
let cur_area = 1;
// 当前坐标尝试向四个方位拓展
for (let k = 0; k < 4; ++k) {
const a = i + nums[k];
const b = j + nums[k + 1];
// 如果新坐标符合要求,当前陆地面积累加
if (a >= 0 && a < rows
&& b >= 0 && b < cols
&& arr[a][b] == 1) {
cur_area += _getMaxArea(arr, a, b);
}
}
return cur_area;
};
for (let i = 0; i < rows; ++i) {
for (let j = 0; j < cols; ++j) {
// 如果是陆地
if (arr[i][j]) {
max_area = Math.max(max_area, _getMaxArea(arr, i, j));
}
}
}
return max_area;
}
const arr = [
[ 1, 0, 1, 1, 0, 1, 0, 1 ],
[ 1, 0, 1, 1, 0, 1, 1, 1 ],
[ 0, 0, 0, 0, 0, 0, 0, 1 ]
];
const result = func(arr);
console.log(result);