岛屿的周长


岛屿的周长

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域
网格中的格子 水平和垂直 方向相连(对角线方向不相连)整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)格子是边长为 1 的正方形 网格为长方形,且宽度和高度均不超过 100 计算这个岛屿的周长

示例 1:
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

示例 2:
输入:grid = [[1]]
输出:4

示例 3:
输入:grid = [[1,0]]
输出:4

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
思路:
计算陆地格子的周长之和,每有一块相邻的陆地,周长减1

代码:
/**
* @param Integer[][] $grid
*
* @return Integer
*/
function islandPerimeter($grid)
{
$all = 0;
foreach ($grid as $line => $lineData) {
foreach ($lineData as $k => $item) {
// 跳过水
if ($item === 0) {
continue;
}
$num = 4;

//如果存在上下左右4个相邻的陆地,没有一个相邻的陆地边长-1
if (
isset($grid[$line - 1][$k]) &&
$grid[$line - 1][$k] == 1
) {
$num = $num - 1;
}

if (
isset($grid[$line + 1][$k]) &&
$grid[$line + 1][$k] == 1
) {
$num = $num - 1;
}

if (
isset($lineData[$k - 1]) &&
$lineData[$k - 1] == 1
) {
$num = $num - 1;
}

if (
isset($lineData[$k + 1]) &&
$lineData[$k + 1] == 1
) {
$num = $num - 1;
}

$all += $num;
}
}

return $all;
}

进阶:每个相邻的边都会使周长-2,修改代码
/**
* @param Integer[][] $grid
*
* @return Integer
*/
function islandPerimeter($grid)
{
$all = 0;
foreach ($grid as $line => $lineData) {
foreach ($lineData as $k => $item) {
// 跳过水
if ($item === 0) {
continue;
}
$num = 4;

//如果存在上下左右4个相邻的陆地,没有一个相邻的陆地边长-1
if (
isset($grid[$line - 1][$k]) &&
$grid[$line - 1][$k] == 1
) {
$num = $num - 2;
}

if (
isset($lineData[$k - 1]) &&
$lineData[$k - 1] == 1
) {
$num = $num - 2;
}

$all += $num;
}
}

return $all;
}