岛屿的周长

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)

posted @ 2024-04-12 10:21  busakura  阅读(66)  评论(0)    收藏  举报