描述
给一个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; } };