解题思路:使用广度优先搜索,遍历图上的每一个点,只要是“1”就向四周扩散,并将扩散的点置为0,同时累加res,最后返回res即可。
java版本
class Solution {
int next[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
public int numIslands(char[][] grid) {
int res = 0,m =grid.size(), n =grid[0].size();
vector<pair<int,int>> q;
function<void(int,int)> bfs = [&](int i,int j){
grid[i][j] = '0';
q.push(i,j);
while(!q.isEmpty()){
auto x = q.top();
q.pop();
for(int i = 0; i < 4; i++){
int tx = x.first+next[k][0];
int ty = x.second+next[k][1];
if(tx < 0 || tx >= m || ty < 0 || ty >= n || grid[tx][ty] == '0') continue;
grid[tx][ty] = '0';
q.push(tx,ty);
}
}
};
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] == '1'){
++res;
bfs(i,j);
}
}
}
return res;
}
}
C++版本
class Solution {
public:
int next[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int numIslands(vector<vector<char>>& grid) {
int res = 0, m = grid.size(), n = grid[0].size();
queue<pair<int,int>> q;
function<void(int,int)> bfs = [&](int i,int j){
grid[i][j] = '0';
q.push(make_pair(i,j));
while(!q.empty()){
auto x = q.front();
q.pop();
for(int i = 0; i < 4; i++){
int tx = x.first + next[i][0];
int ty = x.second + next[i][1];
if(tx < 0 || tx >= m || ty < 0 || ty >= n || grid[tx][ty] == '0')continue;
grid[tx][ty] = '0';
q.push(make_pair(tx,ty));
}
}
};
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] == '1'){
++res;
bfs(i,j);
}
}
}
return res;
}
};