给定一个 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
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 100
grid[i][j] 为 0 或 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/island-perimeter
参考:
python
# 0463.岛屿周长
class Solution:
def islandPerimeter(self, grid: [[int]]) -> int:
"""
总周长 = 4 * 土地个数 - 2 * 接壤边的条数
- 遍历矩阵,遍历到土地, land++
- 如果下方或者右方是土地,以为接壤,border++
:param grid:
:return:
"""
land, border = 0, 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1:
land += 1
# 下方有陆地
if i < len(grid)-1 and grid[i+1][j] == 1:
border += 1
# 右方有陆地
if j < len(grid[0]-1) and grid[i][j+1] == 1:
border += 1
return 4*land - 2*border
def islandPerimeter_(self, grid: [int]) -> int:
"""
深度搜索, DFS
对于每个土地节点,递归上下左右四个点,重复访问的,标记为2,表示访问过了
:param grid:
:return:
"""
def dfs(x, y, grid):
if x<0 or x>len(grid)-1 or y<0 or y>len(grid[0])-1:
return 1
if grid[x][y] == 0:
return 1
if grid[x][y] == 2:
return 0
grid[x][y] = 2
return dfs(x+1,y,grid) + dfs(x-1,y,grid) + dfs(x,y+1,grid) + dfs(x,y-1,grid)
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1:
return dfs(i,j,grid)
return 0
golang
package MAP
// 根据规律求周长
func islandPerimeter(grid [][]int) int {
// perimeter = 4*lands - 2*border
var land, border = 0, 0
for i:=0;i<len(grid);i++ {
for j:=0;j<len(grid[0]);j++ {
if grid[i][j] == 1 {
land++
if i < len(grid)-1 && grid[i+1][j] == 1 {
border++
}
if j < len(grid[0])-1 && grid[i][j+1] == 1 {
border++
}
}
}
}
return 4*land - 2*border
}
// 深度优先搜索, dfs
func islandPerimeter_(grid [][]int) int {
// dfs
var dfs func(x,y int, grid [][]int) int
dfs = func(x, y int, grid [][]int) int {
if x<0 || x>len(grid)-1 || y<0 || y>len(grid[0])-1 {
return 1
}
if grid[x][y] == 0 {
return 1
}
if grid[x][y] == 2 {
return 0
}
grid[x][y] = 2
return dfs(x+1,y,grid)+dfs(x-1,y,grid)+dfs(x,y+1,grid)+dfs(x,y-1,grid)
}
for i:=0;i<len(grid);i++ {
for j:=0;j<len(grid[0])-1;j++ {
if grid[i][j] == 1 {
return dfs(i,j,grid)
}
}
}
return 0
}