1.岛屿的周长
题意:有一个row x col的二维网格地图,其中网格值是1代表陆地,0代表海域,网格外也是海域,网格中的格子只水平相连或者竖直相连,现在网格地图里面恰好有一个岛屿,有一个或多个陆地格子所连接成的岛屿。
岛屿内部没有湖(湖是指水域在岛屿内部,且不和岛屿周围的水相连),网格的边长为1,计算这个岛屿的周长。
方法:DFS
思路:
由于岛屿是几个陆地格子水平相连,或者竖直相连的,并且该题中说明只有一个岛屿,所以使用DFS对第一个陆地格子的四周(上下左右)进行遍历,对于搜索到的陆地格子,继续对其四周进行遍历,如果搜索到的不是岛屿或者网格位置超出范围了,则返回,这样就可以搜索到岛屿。
为了避免搜索的时候出现死循环,对于已经搜索过的陆地格子进行标记。
岛屿的周长是陆地格子与非陆地格子相邻的边长和(包括水域和边界),所以每次从陆地格子搜索到非陆地格子,周长加1。
代码:
点击查看代码
class Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
def dfs(grid,r,c):
###此时已经到地图之外
if not(r>=0 and r<len(grid) and c>=0 and c<len(grid[0])):
return 1
###此时该网格是水域
if grid[r][c]==0:
return 1
###该陆地网格已经被搜索过了
if grid[r][c]==2:
return 0
###该网格是陆地,并且没有被搜索
###避免死循环,对遍历过的岛屿进行标记
grid[r][c]=2
return dfs(grid,r-1,c)+dfs(grid,r+1,c)+dfs(grid,r,c-1)+dfs(grid,r,c+1)
for i in range(0,len(grid)):
for j in range(0,len(grid[0])):
###找到第一个陆地格子
if grid[i][j]==1:
###由于只有一个岛屿,直接返回
return dfs(grid,i,j)