80 BFS和DFS两种方式解岛屿数量

2023-12-30 13:38:04

问题描述:给你一个由'1'(陆地)和'0'(水)组成的二维网格,请你计算网格中岛屿的数量,请你计算岛屿的数量,岛屿总被水包围,并且每座岛屿只能由水平方向和竖直方向上相邻的陆地连接而成,并可以假设改网格的四条边均被水所包围。

dfs求解:首先外侧大循环,如果当前为陆地,则该片陆地一定是岛屿,在总岛屿的路上+1,并在dfs的过程中将遇到的1都变为0,防止下一次dfs遍历到,也为了不让外侧大循环以为他是新的大陆。

public void dfs(int [][]matrix,int i,int j)
{
if(i<0||i>matrix.length||j<0||j>matrix[0].length){return;}
if(matrix[i][j]==0){return;}
matrix[i][j]==0;
dfs(matrix,i+1,j);
dfs(matrix,i-1,j);
dfs(matrix,i,j+1);
dfs(matrix,i,j-1);
}
public void Dfs(int [][]matrix)
{
int count=0;
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[i].length;j++)
{
if(matrix[i][j]==1)
{
count++;
dfs(matrix,i,j);
}
}
}
???????return count;
}

BFS求解,同样基于外侧循环,如果当前matrix[i][j]==1,则更新岛屿数量,否则加入queue队列中进行遍历。

public void bfs(int [][]matrix,int i,j)
{
Queue<Integer>queueRow=new LinkedList<>();
Queue<Integer>queueCol=new LinkedList<>();
queueRow.add(i);
queueCol.add(j);
while(!queueRow.isEmpty())
{
int row=queueRow.poll();
int col=queueCol.poll();
matrix[row][col]=1;
if(row-1>=0&&matrix[row-1][col]==1){queueRow.add(row-1);queueCol.add(col);}
if(row+1<matrx.length&&matrix[row+1][col]==1){queueRow.add(row+1);queueCol.add(col);}
if(col-1>=0&&matrix[row][col-1]==1){queueRow.add(row);queueCol.add(col-1);}
if(col+1<matrx[0].length&&matrix[row][col+1]==1){queueRow.add(row);queueCol.add(col+1);}
}
}
public int Bfs(int [][]matrix)
{
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[i].length;j++)
{
if(matrix[i][j]==1)
{
count++;

bfs(matrix,i,j);
}
}
}
return count++;

}

文章来源:https://blog.csdn.net/qq_52299902/article/details/135303591
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。