1,题目要求
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 water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
11000
11000
00100
00011
Output: 3
给定’1’(陆地)和’0’(水)的2d网格图,计算岛屿数量。 岛被水包围,通过水平或垂直连接相邻的土地而形成。 您可以假设网格的所有四个边都被水包围。
2,题目思路
对于这道题,给定一个二维的地图数据,找出其中的“岛屿”的数量。
其中,1表示陆地,0表示水,连接在一起的1就是岛屿,因此题目要求的就是连续在一起的1的区域的个数。
在解决问题上,我们可以通过深度优先遍历以及对地图信息进行更改的方法来找到对应的“岛屿”的数量。
具体操作上,只要我们遇到为‘1’的点,说明这一块一定是一个岛屿,于是res++,并且我们此时就将与其相连的所有为‘1’的点都改为‘0’,说明是已经计算在内的岛屿。
用这种方法,对地图中所有的点遍历一遍即可。
3,代码实现
int x = []() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
return 0;
}();
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty())
return 0;
n = grid.size();
m = grid[0].size();
int res = 0;
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
if(grid[i][j] == '1')
{
DFS_IslandDection(grid, i, j);
res++;
}
return res;
}
private:
void DFS_IslandDection(vector<vector<char>>& grid, int i, int j){
if(i < 0 || j < 0 || i >=n || j >= m || grid[i][j] != '1')
return;
grid[i][j] = '0';
DFS_IslandDection(grid, i+1, j);
DFS_IslandDection(grid, i-1, j);
DFS_IslandDection(grid, i, j+1);
DFS_IslandDection(grid, i, j-1);
}
private:
int n;
int m;
};