描述
给一个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
示例2
输入:
[[0]]返回值:
0
示例3
输入:
[[1,1],[1,1]]返回值:
1
备注:
01矩阵范围<=200*200
方法一:DFS(吞并1)
class Solution {
public:
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
void dfs(vector<vector<char>>&grid,int i,int j){
int n=grid.size();
int m=grid[0].size();
vector<pair<int,int>>directions={
{-1,0},{1,0},{0,-1},{0,1}
};
grid[i][j]='0';
if(i-1>=0 && grid[i-1][j]=='1')dfs(grid,i-1,j);
if(i+1<n && grid[i+1][j]=='1')dfs(grid,i+1,j);
if(j-1>=0 && grid[i][j-1]=='1')dfs(grid,i,j-1);
if(j+1<m && grid[i][j+1]=='1')dfs(grid,i,j+1);
}
int solve(vector<vector<char> >& grid) {
// write code here
int n=grid.size();
int m=grid[0].size();
int numOfIsland=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='1'){
++numOfIsland;
dfs(grid,i,j);
}
}
}
return numOfIsland;
}
};
方法二:BFS
class Solution {
public:
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
int solve(vector<vector<char> >& grid) {
// write code here
int n=grid.size();
int m=grid[0].size();
int numOfIsland=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='1'){
++numOfIsland;
queue<pair<int, int>>q;
q.push({i,j});
while(!q.empty()){
auto x=q.front();
q.pop();
int row=x.first;
int col=x.second;
if(row-1>=0 && grid[row-1][col]=='1'){
q.push({row-1,col});
grid[row-1][col]='0';
}
if(row+1<n && grid[row+1][col]=='1'){
q.push({row+1,col});
grid[row+1][col]='0';
}
if(col-1>=0 && grid[row][col-1]=='1'){
q.push({row,col-1});
grid[row][col-1]='0';
}
if(col+1<m && grid[row][col+1]=='1'){
q.push({row,col+1});
grid[row][col+1]='0';
}
}
}
}
}
return numOfIsland;
}
};