题目描述
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入: 11110 11010 11000 00000 输出: 1
示例 2:
输入: 11000 11000 00100 00011 输出: 3
问题分析
此题为标准的DFS题。创建一个二维数组point,与二维数组grid是等规模的,行数相同列数也相同,数组point用来记录grid数组中的每一个元素是否被访问过。遍历二维数组grid,当grid[i][j]是1并且point[i][j]为false时,将ans加1,然后调用DFS函数。进入DFS函数后先将point[i][j]置为true,然后开始向四周搜索,当DFS函数返回时,与grid[i][j]在同一个岛屿上的元素就都在point中标记为true了。接下来我们再继续遍历二维数组grid,当数组遍历结束后,ans就是岛屿的数量,返回即可。
代码实现
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty())
return 0;
int ans = 0;
int m = grid.size();
int n = grid[0].size();
vector<vector<bool>> point(m, vector<bool>(n, false));
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(grid[i][j] == '1' && point[i][j] == false){
ans++;
DFS(i, j, ans, point, grid);
}
return ans;
}
void DFS(int i, int j, int& ans, vector<vector<bool>>& point, vector<vector<char>>& grid){
point[i][j] = true;
if(i > 0 && grid[i-1][j] == '1' && point[i-1][j] == false)
DFS(i-1, j, ans, point, grid);
if(j > 0 && grid[i][j-1] == '1' && point[i][j-1] == false)
DFS(i, j-1, ans, point, grid);
if(i < grid.size() - 1 && grid[i+1][j] == '1' && point[i+1][j] == false)
DFS(i+1, j, ans, point, grid);
if(j < grid[0].size() - 1 && grid[i][j+1] == '1' && point[i][j+1] == false)
DFS(i, j+1, ans, point, grid);
}
};