Leetcode200 经典岛屿数量问题
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
class Solution {
public int count=0;
public int numIslands(char[][] grid) {
//深搜,不回头
int row=grid.length;
if(row==0){
return 0;
}
int col=grid[0].length;
int[][]visited=new int[row][col];
for(int i=0;i<row;i++){
Arrays.fill(visited[i],0);
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(grid[i][j]=='1'){
count++;
//dfs(grid,i,j,visited);
bfs(grid,i,j,visited);
}
}
}
return count;
}
public void dfs(char[][] grid,int m,int n,int[][]visited){
int row=grid.length;
int col=grid[0].length;
if(m>=row||m<0||n>=col||n<0||visited[m][n]==1||grid[m][n]!='1'){
return;
}
visited[m][n]=1;
grid[m][n]='2';
dfs(grid,m+1,n,visited);
dfs(grid,m-1,n,visited);
dfs(grid,m,n+1,visited);
dfs(grid,m,n-1,visited);
}
public void bfs(char[][]grid,int m,int n,int[][]visited){
//广搜一定用到队列且每一层的size作为产生下一层出队的个数
Queue<int[]>queue=new LinkedList<>();
int row=grid.length;
int col=grid[0].length;
int[]index=new int[]{m,n};
queue.add(index);
while(!queue.isEmpty()){
for(int i=0;i<queue.size();i++){
int[] in=queue.poll();
//出队的时候设置已visited以及grid对应改为2,毕竟主函数那边还会继续往后遍历寻找下一个独立的点
visited[in[0]][in[1]]=1;
grid[in[0]][in[1]]='2';
if(in[0]-1>=0&&grid[in[0]-1][in[1]]=='1'&&visited[in[0]-1][in[1]]==0){
visited[in[0]-1][in[1]]=1;
//grid[in[0]-1][in[1]]='2';
queue.add(new int[]{in[0]-1,in[1]});
}
if(in[0]+1<row&&grid[in[0]+1][in[1]]=='1'&&visited[in[0]+1][in[1]]==0){
//入队了就visited防止多次入队
visited[in[0]+1][in[1]]=1;
//grid[in[0]+1][in[1]]='2';
queue.add(new int[]{in[0]+1,in[1]});
}
if(in[1]-1>=0&&grid[in[0]][in[1]-1]=='1'&&visited[in[0]][in[1]-1]==0){
visited[in[0]][in[1]-1]=1;
//grid[in[0]][in[1]-1]='2';
queue.add(new int[]{in[0],in[1]-1});
}
if(in[1]+1<col&&grid[in[0]][in[1]+1]=='1'&&visited[in[0]][in[1]+1]==0){
visited[in[0]][in[1]+1]=1;
//grid[in[0]][in[1]+1]='2';
queue.add(new int[]{in[0],in[1]+1});
}
}
}
}
}