题目要求:
给定一个“1”(陆地)和“0”(水域)的二维网格地图,计算岛屿的数量。岛屿被水环绕,通过水平或垂直连接相邻的陆地而形成。你可以假设网格的四个边都被水包围着。
例如:
Input:
11110
11010
11000
00000
Output: 1
考虑如下方法解决问题:
(1)DFS方法
采用深度优先遍历算法,首先得到n,m也就是网格的横纵长度,从而进行遍历;ret是岛屿的个数,双重for循环寻找遍历网格,如果不为‘0’,记录下来,对这一点进行深度优先遍历。
深度优先遍历:
超出范围或者元素为‘0’,均返回。否则,把这一点元素变为‘0’,开始对这一点四周的元素进行访问。
int numIslands_DFS(vector<vector<char>> &grid) //DFS
{
if(!grid.empty())
n = grid.size();
else return 0;
if(!grid[0].empty())
m = grid[0].size();
else return 0;
int ret = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0 ; j<m ; j++)
{
if(grid[i][j] != '0')
{
ret += 1;
dfs(grid,i,j);
}
}
}
return ret;
}
void dfs(vector<vector<char>> &grid , int i, int j)
{
if(i<0 || i>=n || j<0 || j>=m)
return ;
if(grid[i][j] == '0')
return ;
else{
grid[i][j] = '0';
dfs(grid,i+1,j);
dfs(grid,i-1,j);
dfs(grid,i,j+1);
dfs(grid,i,j-1);
}
}
(2)BFS算法
广度优先算法如下:
int numIslands_BFS(vector<vector<char>>& grid)
{
if(!grid.empty())
n = grid.size();
else return 0;
if(!grid[0].empty())
m = grid[0].size();
else return 0;
int ret =0;
for(int i =0;i<n;i++)
for(int j=0;j<m;j++)
if(grid[i][j]!='0')
{
ret+=1;
bfs(grid,i,j);
}
return ret;
}
void bfs(vector<vector<char>> &grid,int i,int j)
{
queue<vector<int>> q;
q.push({i,j});
grid[i][j] = '0';
while(!q.empty())
{
i = q.front()[0],j = q.front()[1];
q.pop();
if(i>0&&grid[i-1][j] == '1')
{
q.push({i-1,j});
grid[i-1][j] = '0';
}
if(i<n-1&&grid[i+1][j] == '1')
{
q.push({i+1,j});
grid[i+1][j] = '0';
}
if(j>0&&grid[i][j-1] == '1')
{
q.push({i,j-1});
grid[i][j-1] = '0';
}
if(j<m-1&&grid[i][j+1] == '1')
{
q.push({i,j+1});
grid[i][j+1] = '0';
}
}
}