【Leetcode 深搜】统计封闭岛屿的数目(1254)

题目

有一个二维矩阵 grid?,每个位置要么是陆地(记号为?0 )要么是水域(记号为?1 )。
我们从一块陆地出发,每次可以往上下左右?4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。
如果一座岛屿?完全?由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。
请返回封闭岛屿的数目。

示例 1:

输入:grid = [[1,1,1,1,1,1,1,0],
             [1,0,0,0,0,1,1,0],
             [1,0,1,0,1,1,1,0],
             [1,0,0,0,0,1,0,1],
             [1,1,1,1,1,1,1,0]]
输出:2
解释:
灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。

示例 2:

输入:grid = [[0,0,1,0,0],
             [0,1,0,1,0],
             [0,1,1,1,0]]
输出:1

示例 3:

输入:grid = [[1,1,1,1,1,1,1],
?            [1,0,0,0,0,0,1],
?            [1,0,1,1,1,0,1],
?            [1,0,1,0,1,0,1],
?            [1,0,1,1,1,0,1],
?            [1,0,0,0,0,0,1],
             [1,1,1,1,1,1,1]]
输出:2

提示:

1 <= grid.length, grid[0].length <= 100
0 <= grid[i][j] <=1

解答

本题与岛屿数量的区别在于和边界相连的岛屿不算岛屿。从某个点开始深搜是否会连接到边界,用一个变量标记即可
color对每次深搜标记,Time: O(mn), Space: O(mn)

(用广搜也可以做,大部分情况下,深度优先和广度优先可以相互替换。)

class Solution:
    def __init__(self):
        self.a = []
        self.next = [
            [0, 1],
            [1, 0],
            [0, -1],
            [-1, 0]
        ]
        self.m = 0
        self.n = 0
        self.p = 0  # 标记是否会连到边界

    def closedIsland(self, grid) -> int:
        if not grid:
            return 0
        self.a, self.m, self.n = grid, len(grid), len(grid[0])
        color = 0
        for i in range(1, self.m-1):  # 不包含边界遍历
            for j in range(1, self.n-1):
                if self.a[i][j] == 0:
                    self.p = 0
                    color -= 1

                    self.a[i][j] = color
                    self.dfs(i, j, color)
                    if self.p != 0:
                        color += 1
        return -color

    def dfs(self, x, y, color):
        for i in range(4):
            tx = x + self.next[i][0]
            ty = y + self.next[i][1]
            if tx >= 0 and ty >= 0 and tx < self.m and ty < self.n and self.a[tx][ty] == 0:
                if tx == 0 or ty == 0 or tx == self.m-1 or ty == self.n-1:  # 与边界相连
                    self.p = 1
                else:
                    self.a[tx][ty] = color
                    self.dfs(tx, ty, color)

s = Solution()
ans = s.closedIsland([
    [0, 0, 1, 1, 0, 1, 0, 0, 1, 0],
    [1, 1, 0, 1, 1, 0, 1, 1, 1, 0],
    [1, 0, 1, 1, 1, 0, 0, 1, 1, 0],
    [0, 1, 1, 0, 0, 0, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1, 1, 1],
    [1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
    [1, 1, 1, 0, 0, 1, 0, 1, 0, 1],
    [1, 1, 1, 0, 1, 1, 0, 1, 1, 0]
])
print(ans)

# # 染色后的矩阵
# import pprint
# pprint.pprint(s.a)

# 5
# [[0, 0, 1, 1, 0, 1, 0, 0, 1, 0],
#  [1, 1, -1, 1, 1, -2, 1, 1, 1, 0],
#  [1, -2, 1, 1, 1, -2, -2, 1, 1, 0],
#  [0, 1, 1, -2, -2, -2, -2, 1, -3, 1],
#  [0, -2, -2, -2, -2, -2, 1, 1, 1, 0],
#  [0, 1, -2, 1, -2, 1, -4, 1, 1, 1],
#  [1, -4, 1, -5, 1, 1, -4, -4, -4, 1],
#  [1, 1, 1, 1, 1, 1, -4, -4, -4, 0],
#  [1, 1, 1, -6, -6, 1, -4, 1, -4, 1],
#  [1, 1, 1, 0, 1, 1, 0, 1, 1, 0]]

原文地址:https://www.cnblogs.com/ldy-miss/p/12180709.html

时间: 2024-11-13 08:20:11

【Leetcode 深搜】统计封闭岛屿的数目(1254)的相关文章

LEETCODE 5257. 统计封闭岛屿的数目 Number of Closed Islands

地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 ). 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」. 如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」. 请返回封闭岛

leetcode 深搜广搜

遍历整个grid数组,当发现有1的时候,就把和这个1连成片的1都置为0,并增加一个计数.最后返回这个计数. 广搜,但这个代码通不过测试,栈溢出. class Solution { public: void bfs(vector<vector<char>>& grid,int i,int j){ if(i<0||j<0||i>=grid.size()||j>=grid[0].size()) return; if(grid[i][j]=='0') ret

深搜 ,广搜,队列 nyoj 27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

[题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2476    Accepted Submission(s): 1621 Problem Description A while ago I had trouble sleeping. I used to lie awake,

深搜——最优方案

Wikioi 1005 生日礼物 题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别喜欢蝴蝶,所以决定折蝴蝶作为给小寒的生日礼物.他来到了PK大学最大的一家地下超市,在超市里,小松找到了n种可以用来折纸的本子.每种类型的本子里有若干不同颜色的纸若干张,当然同种类型的本子一定是完全一样的,而不同种类型的本子不一定完全不一样.他统计了一下,这里总共有n种不同类型的可以用来折纸的本子,每种本子各有bi本,所有的纸中有m种颜色是小寒所喜欢的颜色.小松希望他折的每种颜色的

hdu1518(Square)深搜+剪枝

点击打开杭电1518 Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20,

ACM 海贼王之伟大航路(深搜剪枝)

"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的岛屿. 因为伟大航路上的气候十分异常,所以来往任意两个岛屿之间的时间差别很大,从A岛到B岛可能需要1天,而从B岛到A岛则可能需要1年.当然,任意两个岛之间的航行时间虽然差别很大,但都是已知的. 现在假设路飞一行从罗格镇(起点)出发,遍历伟大航路中间所有的岛屿(但是已经经过的岛屿不能再次经过),最后到达拉夫德鲁

2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)

题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52310 problem description Define the depth of a node in a rooted tree by applying the following rules recursively: • The depth of a root node is 0. • The depths of child nodes whose parents are with

深搜整理汇总

2801 LOL-盖伦的蹲草计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战. 战斗发生在召唤师峡谷.整个召唤师峡谷被分割成M行N列的一个矩阵,矩阵中有空地和几片草丛.这几片草丛中有