首页 > 其他分享 >463. 岛屿的周长

463. 岛屿的周长

时间:2023-09-04 13:44:06浏览次数:28  
标签:周长 岛屿 direct 463 height width range grid visited

链接

https://leetcode.cn/problems/island-perimeter/description/

思路

这题理论上来讲可以用深搜广搜来做,但我第一时间没搞明白怎么做,所以就先迭代一发。

思路就是:

1. 题目给定的只有1个岛屿,那么我们可以遍历整个grid,对于发现的新岛屿,先按其没有相邻来处理(+4)。然后看一下他周边是否有其他岛屿,如果有的话就-1.

2. 同样的思路,我可以写成深搜。

3. 同样的思路,我可以写成广搜。

代码一

class Solution:
    def islandPerimeter(self, grid) -> int:
        height = len(grid)
        if height < 1:
            return 0
        width = len(grid[0])
        if width < 1:
            return 0
        direct_x = [0, -1, 0, 1]
        direct_y = [-1, 0, 1, 0]
        res = 0
        for i in range(height):
            for j in range(width):
                if grid[i][j] == 1:
                    res += 4
                    for k in range(4):
                        new_x, new_y = i + direct_x[k], j + direct_y[k]
                        if 0 <= new_x < height and 0 <= new_y < width and grid[new_x][new_y] == 1:
                            res -= 1
        return res

代码二

class Solution:
    def islandPerimeter(self, grid) -> int:
        height = len(grid)
        if height < 1:
            return 0
        width = len(grid[0])
        if width < 1:
            return 0
        visited = [[False for i in range(width)] for i in range(height)]
        res = 0
        for i in range(height):
            for j in range(width):
                if not visited[i][j] and grid[i][j] == 1:
                    res += self.dfs(i, j, grid, visited)
        return res

    def dfs(self, x, y, grid, visited):
        if visited[x][y]:
            return 0
        visited[x][y] = True
        res = 4
        direct_x = [-1, 0, 1, 0]
        direct_y = [0, -1, 0, 1]
        for i in range(4):
            target_x, target_y = x + direct_x[i], y + direct_y[i]
            if 0 <= target_x < len(grid) and 0 <= target_y < len(grid[0]) and grid[target_x][target_y] == 1:
                res -= 1
                if not visited[target_x][target_y]:
                    res += self.dfs(target_x, target_y, grid, visited)
        return res


if __name__ == '__main__':
    s = Solution()
    print(s.islandPerimeter([[0, 1, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [1, 1, 0, 0]]))

代码三:

class Solution:
    def islandPerimeter(self, grid) -> int:
        height = len(grid)
        if height < 1:
            return 0
        width = len(grid[0])
        if width < 1:
            return 0
        visited = [[False for i in range(width)] for i in range(height)]
        res = 0
        for i in range(height):
            for j in range(width):
                if not visited[i][j] and grid[i][j] == 1:
                    res += self.bfs(i, j, grid, visited)
        return res

    def bfs(self, x, y, grid, visited):
        if visited[x][y]:
            return 0
        visited[x][y] = True
        res = 4
        direct_x = [-1, 0, 1, 0]
        direct_y = [0, -1, 0, 1]
        next_pool = []
        for i in range(4):
            target_x, target_y = x + direct_x[i], y + direct_y[i]
            if 0 <= target_x < len(grid) and 0 <= target_y < len(grid[0]) and grid[target_x][target_y] == 1:
                res -= 1
                if not visited[target_x][target_y]:
                    next_pool.append((target_x, target_y))
        for next_x, next_y in next_pool:
            res += self.bfs(next_x, next_y, grid, visited)
        return res


if __name__ == '__main__':
    s = Solution()
    print(s.islandPerimeter([[0, 1, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [1, 1, 0, 0]]))

 

标签:周长,岛屿,direct,463,height,width,range,grid,visited
From: https://www.cnblogs.com/bjfu-vth/p/17676798.html

相关文章

  • P1463 [POI2001] [HAOI2007] 反素数 题解
    P1463[POI2001][HAOI2007]反素数题解可以发现,最大的不超过\(n\)的反素数就是\(1\simn\)中因数最多的数字。证明:设\(x,x\in[1,n]\)为\(1\simn\)中因数最多的数字,则\(x<y\len\)都不会成为答案,因为存在\(x<y\)因数比\(y\)多,同时也不会存在\(y'<x\)......
  • 东方博宜OJ1005 已知一个圆的半径,求解该圆的面积和周长 C语言版
    题目描述已知一个圆的半径,求解该圆的面积和周长。输入输入只有一行,只有 11 个整数。输出输出只有两行,一行面积,一行周长。(保留两位小数)。令 paˋi=3.1415926。样例输入1输出3.146.28说明圆的面积和周长求解公式分别如下;圆的面积 S=π× ......
  • LeetCode 463.岛屿的周长
    1.题目:给定一个 rowxcol 的二维网格地图 grid ,其中:grid[i][j]=1 表示陆地, grid[i][j]=0 表示水域。网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(......
  • 【230827-2】▲ABC中,aCosB+bCosA=2cCosC,c=根号七,S△ABC=根号3*1.5 . 求:▲ABC的周长=?
    ......
  • 【图论#02】岛屿数量,flood fill算法的代码实现与优化
    岛屿数量给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","1","0"],["1","1"......
  • LeetCode 200.岛屿数量
    1.题目:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。 示例1:输入:grid=[["1","1","1","1","0"],["1","1",&q......
  • 【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长
    文章目录一、经度、纬度概念二、地球周长计算1、地球半径、周长计算2、地球经线周长计算3、地球纬线周长计算三、经纬度相关计算1、经纬度坐标距离计算公式2、经纬度与实际距离换算1米对应经度1米对应纬度3、实际距离与经纬度换算1度经度对应东西距离1度纬度对应南北距离四、......
  • 岛屿
    岛屿给定若干棵基环树森林,求解每棵基环树的直径之和。首先如果最长的两个点在环上某个点的子树中,可以直接求解树的直径。若最长的两个点穿越了环,则一定是环上两点子树内最深的两个点。对于每个基环上的点,可以求出其子树内最深的深度,设基环树上两点最长的距离为\(S(i,j)\),然后......
  • 【USACO OPEN12铜组】岛屿
    【USACOOPEN12铜组】岛屿目录【USACOOPEN12铜组】岛屿题目描述输入格式输出格式数据范围输入样例:输出样例:思路code2014.岛-AcWing题库题目描述每当下雨时,农夫约翰的田地总是被洪水淹没。由于田地不是完全水平的,所以一些地方充满水后,留下了许多被水隔开的“岛”。约翰的......
  • 【大联盟】20230706 graph(graph) QOJ4635 【Graph Operation】
    题解赛时得分:60/?写了个乱搞首先考虑无解的条件。注意到一次操作后,所有点的度数都没有改变,所以无解的充分条件就是存在一个点的度数在两张图中不相等。接下来尝试构造策略,使得度数相等的时候都能出解。我们可以将题意转化一下,变为对图\(G\)和图\(H\)都可以操作,使得最后产......