# 岛屿的周长(463)
# 题目
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
# 示例
输入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]
1
2
3
4
2
3
4
输出: 16
# 算法
遍历每一个陆地(值为1),然后判断与他相邻的地块是否是海洋(或者是否是边界),如果是,那么周长+1
export const islandPerimeter = (grid) => {
// 如果基点是(0,0)的话,周围四块相邻区域的坐标(dx[i],dy[i])
const dx = [0, 1, 0, -1];
const dy = [1, 0, -1, 0];
let ans = 0;
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (grid[i][j]) {
// 生成周围四块相邻区域的坐标
for (let k = 0; k < 4; k++) {
let ix = dx[k] + i;
let iy = dy[k] + j;
if (ix < 0 || ix >= grid.length || iy < 0 || iy >= grid[0].length || !grid[ix][iy]) {
ans++;
}
}
}
}
}
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21