LeetCode | 200. 岛屿数量

原题(Medium):  

  给定一个由 ‘1‘(陆地)和 ‘0‘(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

  

思路:递归

  这题类型跟我们之前做过的一题单词搜索类似。所以我在看到这题之后,就想到了可以用与之相同的思路:建立一个代表搜索方向的数组,在当前坐标下,如果往某个方向移动一格是符合一定条件的,就往该方向移动一格,且是递归形式的移动。在这里条件就是不超越边界,且该方向上有岛屿可供移动,且是未被访问过的。如果4个方向都尝试完毕,就可以返回了。为了防止重复访问已经被访问过的岛屿格,需要一个访问数组做记录。在递归过程中,每前进一格(符合条件才会前进),就设置该格已被访问。

 1 int xy[4][4] = { { 1,0 },{ 0,-1 },{ -1,0 },{ 0,1 } };        //代表搜索方向的数组
 2
 3 void helper(vector<vector<int>>& grid, int x, int y, vector<vector<bool>>& visited)
 4 {
 5     visited[y][x] = true;
 6     for (int i = 0; i < 4; i++)
 7     {
 8         //以当前网格起点,尝试其四周能能否移动,能就继续递归移动,直至整座岛屿被访问完毕
 9         int tempX = x + xy[i][0];
10         int tempY = y + xy[i][1];
11         //不超越边界,且该方向上有岛屿可供移动,且是未被访问过的
12         if (tempY >= 0 && tempY<grid.size() && tempX >= 0 && tempX<grid[0].size() && grid[tempY][tempX] && !visited[tempY][tempX])
13             helper(grid, tempX, tempY, visited);
14     }
15 }
16 int numIslands(vector<vector<int>>& grid) {
17     vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false));
18
19     int count = 0;
20
21     for (int i = 0; i<grid.size(); i++)
22         for (int j = 0; j< grid[0].size(); j++)
23         {
24             if (grid[i][j] && !visited[i][j])
25             {
26                 //主函数:从网格中查找每一个岛屿,只要发现一格陆地,整座岛屿都会在递归中被访问,那么在之后的查找中便不会再次访问
27                 helper(grid, i, j, visited);
28                 //每进来这里表示发现了一座岛屿,计数器+1
29                 count++;
30             }
31         }
32     return count;
33 }

原文地址:https://www.cnblogs.com/MisakiJH/p/11756266.html

时间: 2024-08-30 14:58:16

LeetCode | 200. 岛屿数量的相关文章

leetcode 200. 岛屿数量(dfs||bfs)

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入:11110110101100000000 输出: 1示例 2: 输入:11000110000010000011 输出: 3 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-islands class Solution { pu

Leetcode 200.岛屿的数量 - DFS、BFS

Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7MB,99.7% / 92% public: /** * row,col: 坐标,以0开始. * 用row和col,而不是x,y. 否则容易写成grid[x][y],顺序不对!! */ void dfs_set_zero(vector<vector<char>>& grid, i

LeetCode | 0200. Number of Islands岛屿数量【Python】

LeetCode 0200. Number of Islands岛屿数量[Medium][Python][DFS] Problem LeetCode Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or v

[LeetCode] 200. Number of Islands 岛屿的数量

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by

树和图(leetcode) : 岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 解答(C++): class Solution { public: //广度优先搜索 void dfs(vector<vector<char>>

【leetcode-200 深度优先+广度优先】 岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入:11110110101100000000 输出: 1示例 2: 输入:11000110000010000011 输出: 3 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-islands 方法一:深度优先搜索 [通过]直觉 将

岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例1: 输入: 11110 11010 11000 00000 输出: 1 示例2: 输入: 11000 11000 00100 00011 输出: 3 解题思路: 本题是Leetcode中的一道BFS算法题,采用BFS算法,遍历整个数组,遇到陆地时将其放入队列中,遍历完与其向相连的所有大陆,并将遍历过的陆地清除(

DFS或BFS(深度优先搜索或广度优先搜索遍历无向图)-04-无向图-岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入:11110110101100000000 输出: 1示例 2: 输入:11000110000010000011 输出: 3 1 class Solution { 2 public: 3 int dist[4][2] = {0,1,0,-1,1,0,-1,0}; 4 queue<pair<int,i

leetcode 463. 岛屿的周长(Island Perimeter)

目录 题目描述: 示例 : 解法: 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相连(对角线方向不相连).整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿). 岛屿中没有"湖"("湖" 指水域在岛屿内部且不和岛屿周围的水相连).格子是边长为 1 的正方形.网格为长方形,且宽度和高度均不超过 100 .计算这个岛屿的周长. 示例 : 输入: [[0,1,0