题目描述
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
解答
本题思路和Leetcode 79. 单词搜索 C++ (深度优先搜索 &&回溯)的方法是相同的。
使用深度优先搜索,如果发现给定矩阵grid中某一个位置的值是’1’,说明是陆地,那么就使用深度优先搜索算法将和它相连的陆地全部标记。这样就得到一个岛屿。如此,历遍给定矩阵grid就可以得到答案。
注意:
一开始,我打算申请一个同样大小的flag矩阵用来标记grid中的陆地是否已经使用过。但是发现其实不用,直接改变grid[i][j]的值就可以标记。
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty()) return 0;//测试用例中有空测试样例
int row=grid.size(), column=grid[0].size();
//vector<vector<int>> flag(row,vector<int>(column,0));
int count=0;
for(int i=0;i<row;++i)
{
for(int j=0;j<column;++j)
{
if(grid[i][j]=='1')
{
count++;
grid[i][j]='2';//标记为2说明已经是属于某个岛屿
dfs(grid,i,j);
}
}
}
return count;
}
void dfs(vector<vector<char>> &grid, int i, int j)
{
if(j+1<grid[0].size() && grid[i][j+1]=='1')
{
grid[i][j+1]='2';
dfs(grid,i,j+1);
}
if(i+1<grid.size() && grid[i+1][j]=='1')
{
grid[i+1][j]='2';
dfs(grid,i+1,j);
}
if(j-1>=0 && grid[i][j-1]=='1')
{
grid[i][j-1]='2';
dfs(grid,i,j-1);
}
if(i-1>=0 && grid[i-1][j]=='1')
{
grid[i-1][j]='2';
dfs(grid,i-1,j);
}
}
};