描述
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3
(注:存储的01数据其实是字符'0','1')
示例1
输入:
[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]复制
返回值:
3复制
1、遍历一个二维数组比较简单,无论是用暴力遍历还是其他BFS或者DFS算法;
2、因为连着的1可以被看做一个岛屿,所以如何计算岛屿的数量是本题的难点;
3、本题使用淹没法,找到一个"1"后岛屿的数量就可以加1,同时把这个1上下左右相连的1全用0淹没掉,防止重复计算。
4、淹没的结束条件是遇到0.
class Solution {
public:
void bfs(vector<vector<char> >& grid, int x, int y) {
int m = grid.size();
int n = grid[0].size();
if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == '0') {
return;
}
grid[x][y] = '0';
bfs(grid, x, y - 1);
bfs(grid, x, y + 1);
bfs(grid, x - 1, y);
bfs(grid, x + 1, y);
}
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
int solve(vector<vector<char> >& grid) {
// write code here
int m = grid.size();
int n = grid[0].size();
int res = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
res++;
bfs(grid, i, j);
}
}
}
return res;
}
};

京公网安备 11010502036488号