岛屿

[LeetCode] 1254、统计封闭岛屿的数目

让人想犯罪 __ 提交于 2020-01-04 00:03:51
题目描述 如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「 封闭岛屿 」(每个位置要么是陆地(记号为 0 )要么是水域(记号为 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 区域包围)。 解题思路 回溯经典题目:39、40、46、47、51、52等。本题和第1020题类似,普通的“ DFS着色法 ”就可以啦。本题和最普通的“数岛屿个数”(leetcode 200)的区别只是要求封闭,所以只需要代入一个变量表示岛屿是否封闭就可以啦。我的实现。 一题看透 DFS 和 DFS :DFS 和 BFS 都是常用来遍历搜索树或图的算法。二叉树中的前序、中序和后序遍历都属于DFS,层次遍历属于BFS。DFS常用递归和栈来实现,BFS常用队列来实现。 解题思路如下:每次遇到陆地则DFS。对该过程进行判断:如果途中丝毫不经过“边界”,则这就算作1个封闭岛屿;如果经过“边界”,则不算。 题目要我们求出封闭岛屿的个数,那我们可以先遍历矩阵中的每一个位置,如果当前位置为0(陆地)

海岛争霸

爷,独闯天下 提交于 2019-12-30 00:05:25
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1248 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。杰克船长准备从自己所占领的岛屿A开始征程,逐个去占领每一个岛屿。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。 杰克船长手头有一张整个海域的海图,上面详细地记录了各个海屿的位置,以及海屿之间的通航路线。但他发现,有的航海路线太危险了,杰克船长的战船很难直接通过,他必须想方设法绕道航行;还有的岛屿根本到达不了。 杰克船长现在想把航行的危险程度降到最小。具体地来说,就是杰克船长提出若干个询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少。 输入 第1行: N M 表示有N个岛屿,M条直航路线 第2~M+1行: A B V 表示从岛屿A到岛屿B的航海路线的危险程度值为V。 接下面一行 : Q 表示询问的次数。 之后有Q个行: A B 表示询问从岛屿A 到岛屿B 所经过的航线,危险程度最小值 1<N≤100 0<M≤500 1≤ Q≤20 0 < V≤1000, 所有数据都是正整数

LeetCode 1254.封闭岛屿的周长(BFS)

China☆狼群 提交于 2019-12-21 00:31:38
注意:原题是求封闭岛屿数量,我改成了求封闭岛屿的周长 /** * @Author: Wilson79 * @Datetime: 2019年12月16日 星期一 22:41:13 * @Filename: 1254.封闭岛屿的周长.cpp */ const int N = 120 ; typedef pair < int , int > PII ; # define x first # define y second PII q [ N * N ] ; bool st [ N ] [ N ] ; int bfs ( int sx , int sy , vector < vector < int >> & grid ) { int flag = 1 ; int n = grid . size ( ) , m = grid [ 0 ] . size ( ) ; int hh = 0 , tt = 0 ; q [ 0 ] = { sx , sy } ; st [ sx ] [ sy ] = true ; int cnt = 0 ; while ( hh <= tt ) { auto t = q [ hh ++ ] ; int dx [ ] = { 1 , - 1 , 0 , 0 } , dy [ ] = { 0 , 0 , 1 , - 1 } ; for ( int i = 0 ; i <

岛屿数量

安稳与你 提交于 2019-12-14 11:27:05
岛屿数量 给定一个由 '1' (陆地)和 '0' (水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 分析: 进行深度遍历或广度遍历,每进行一次遍历确定当前坐标所在地是不是一个岛屿。 广度遍历 class Solution { public: int numIslands(vector<vector<char>>& grid) { if(grid.size() < 1) return 0; // 岛屿数量 int count = 0; // 遍历每一个节点 for(int i=0; i<grid.size(); i++){ for(int j=0; j<grid[0].size(); j++){ // 进行广度遍历 if(BFS(grid,i,j)) count ++; } } return count; } /* 111 010 111 */ // 进行广度遍历,有节点就return bool BFS(vector<vector<char>>& grid, int x, int y){ if(grid[x][y] != '1')

1254. 统计封闭岛屿的数目

一曲冷凌霜 提交于 2019-12-05 02:31:14
题目:   有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。   我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。   如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。   请返回封闭岛屿的数目。          输入 :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 区域包围)。 分析:   1.对于边界而言,即使其为陆地,也至少存在一个变不能临近水域,所以不可能构成孤岛;   2.对于边界上的陆地而言,其相邻的陆地,肯定也构不成孤岛,即所能到达的陆地,均不可以。   3.对于剩余区域的陆地X,其所能到达的陆地Y,能够和X构成同一片岛屿。 方案:(参考别人的 https://leetcode-cn.com/problems/number-of-closed-islands/solution/yi-ti-kan-tou-dfs-he-dfs-by-xiao-xiao-suan-fa

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

旧城冷巷雨未停 提交于 2019-12-04 04:07:16
地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 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]]

433 岛屿的个数

匿名 (未验证) 提交于 2019-12-03 00:39:02
原题网址: https://www.lintcode.com/problem/number-of-islands/description 描述 给一个01矩阵,求不同的岛屿的个数。 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。 是 样例 在矩阵: [ [1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1] ] 3 ˼· :利用图像处理中区域生长的思想。 1.创建一个与grid相同大小值为0的矩阵tmp,用来保存生长后的结果。即tmp中同一个岛屿的坐标点对应数值一样。设置标签lable=0,该值记录岛屿编号。 2.遍历grid,如果当前点对应值为1且tmp相同点对应值为0,说明该点属于新岛屿,lable++,tmp=lable。同时,以该点为种子点进行4邻域生长。 3.生长过程借助栈,首先将上步种子点压入栈中。 如果种子点4邻域的某个点grid值为1且tmp值为0,说明该点待生长,将tmp赋值为lable,再将该点压入栈中。 重复上述生长过程直到栈为空,说明一个岛屿生长完毕。 最后返回lable。 AC代码: class Solution { public : /* * * @param grid: a boolean 2D

LeetCode 463 岛屿的周长

匿名 (未验证) 提交于 2019-12-03 00:04:02
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 示例 : 输入: [[0,1,0,0], 输出: 16 解释: 它的周长是下面图片中的 16 个黄色的边: 解法一 最常规的解法,如果走到1的位置,我们便判断该位置的情况,先附一个初值,然后根据每一种特殊情况减去1,得到的结果添加到总的结果中: class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: res = 0 for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j]==1: plus = 4 if i>0 and grid[i-1][j]==1: plus-=1 if i<len(grid)-1 and grid[i+1][j]==1: plus-=1 if j>0 and grid[i][j-1]==1: plus-=1 if j<len(grid[0])-1 and grid[i][j+1]=

LeetCode 463 岛屿的周长

匿名 (未验证) 提交于 2019-12-03 00:03:02
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 示例 : 输入: [[0,1,0,0], 输出: 16 解释: 它的周长是下面图片中的 16 个黄色的边: 解法一 最常规的解法,如果走到1的位置,我们便判断该位置的情况,先附一个初值,然后根据每一种特殊情况减去1,得到的结果添加到总的结果中: class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: res = 0 for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j]==1: plus = 4 if i>0 and grid[i-1][j]==1: plus-=1 if i<len(grid)-1 and grid[i+1][j]==1: plus-=1 if j>0 and grid[i][j-1]==1: plus-=1 if j<len(grid[0])-1 and grid[i][j+1]=

Leetcode 695.岛屿的最大面积

匿名 (未验证) 提交于 2019-12-02 23:43:01
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) 示例 1: [[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] 对于上面这个给定的矩阵, 返回 0。 注意: 给定的矩阵grid 的长度和宽度都不超过 50。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-area-of-island Javascript 代码实现: /** * @param {number[]