题目:200. 岛屿数量
思路:bfs+dfs,两种解法。C++版本是bfs版本,JAVA和GO是dfs版本。
C++版本:
cpp
class Solution {
public:
typedef pair<int,int> PII;
int fx[4]={-1,1,0,0};
int fy[4]={0,0,-1,1};
void dfs(int X,int Y,vector<vector<char>>& grid,vector<vector<bool>> &sta,int n,int m){
queue<PII> qu;
qu.push({X,Y});
sta[X][Y]=true;
while(qu.size()){
PII tmp=qu.front();
qu.pop();
int x=tmp.first,y=tmp.second;
for(int i=0;i<4;i++){
int xx=x+fx[i];
int yy=y+fy[i];
if(xx<0||yy<0||xx>=n||yy>=m){
continue;
}
if(sta[xx][yy]==true||grid[xx][yy]=='0'){
continue;
}
sta[xx][yy]=true;
qu.push({xx,yy});
}
}
return ;
}
int numIslands(vector<vector<char>>& grid) {
int ans=0;
int n=grid.size(),m=grid[0].size();
vector<vector<bool>> sta(n,vector<bool>(m,false));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(sta[i][j]==false && grid[i][j]=='1'){
dfs(i,j,grid,sta,n,m);
ans++;
}
}
}
return ans;
}
};
JAVA版本:
java
class Solution {
void dfs(int x,int y,char[][] grid){
if(x<0||y<0||x>=grid.length||y>=grid[0].length) return;
if(grid[x][y]!='1') return;
grid[x][y]='2';
dfs(x-1,y,grid);
dfs(x,y-1,grid);
dfs(x,y+1,grid);
dfs(x+1,y,grid);
}
public int numIslands(char[][] grid) {
int ans=0;
int n=grid.length,m=grid[0].length;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='1'){
dfs(i,j,grid);
ans++;
}
}
}
return ans;
}
}
GO版本:
go
func numIslands(grid [][]byte) int {
n,m:=len(grid),len(grid[0])
ans:=0
for i:=0;i<n;i++ {
for j:=0;j<m;j++ {
if grid[i][j]=='1' {
dfs(i,j,&grid)
ans++
}
}
}
return ans
}
func dfs(x,y int,grid * [][]byte) {
if x<0||y<0||x>=len((*grid))||y>=len((*grid)[0]) {
return
}
if (*grid)[x][y]!='1' {
return
}
(*grid)[x][y]='2'
dfs(x-1,y,grid)
dfs(x+1,y,grid)
dfs(x,y-1,grid)
dfs(x,y+1,grid)
}