题目: 该题有在google面试中出现
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
11000
11000
00100
00011
Output: 3
题意:
给定一个二维字符数组,它代表一片海域,其中1表示地面,0表示海水,我们需要找到这一片海域有多少个岛屿,岛屿的定义是这样的: 一块岛屿的四周都是水,也就是上下左右(不包括斜对角),假设情况下边界都是水。
解法:
这道题我采用BFS来进行求解。
首先我们建立一个记录访问的数组 visited[][] 它与海域数组同等大小,它记录哪一块地面我们访问过(初始为0 ,访问过后设置为1)
之后我们开始遍历海域的数组,每遇到一个地面,就依据这个地面,上下左右的进行BFS查找是否有邻接的地面,不断进行广度优先搜索,直到无法继续找到新地面,这样就完成了一个岛屿的查找,访问过的地面都记1。 之后我们继续遍历,寻找访问点为0 的地面,再进行BFS
代码:
class Solution {
public int numIslands(char[][] grid) {
int res=0;
int width=grid.length;
if(width==0) return 0;
int length=grid[0].length;
int [][]visited=new int[width][length];
for(int i=0;i<width;i++){
for(int j=0;j<length;j++){
if(visited[i][j]==0&&grid[i][j]=='1'){
res++;
BFS(visited,grid,i,j,width,length);
}
}
}
return res;
}
public void BFS(int [][]visited,char[][] grid,int x,int y,int width,int length){
Queue<Integer> queueX = new LinkedList<Integer>();
Queue<Integer> queueY = new LinkedList<Integer>();
queueX.offer(x);
queueY.offer(y);
while(queueX.size()!=0){
int a=queueX.poll();
int b=queueY.poll();
if(a+1<width){
if(grid[a+1][b]=='1'&&visited[a+1][b]==0){
queueX.offer(a+1);
queueY.offer(b);
visited[a+1][b]=1;
}
}
if(a-1>=0){
if(grid[a-1][b]=='1'&&visited[a-1][b]==0){
queueX.offer(a-1);
queueY.offer(b);
visited[a-1][b]=1;
}
}
if(b-1>=0){
if(grid[a][b-1]=='1'&&visited[a][b-1]==0){
queueX.offer(a);
queueY.offer(b-1);
visited[a][b-1]=1;
}
}
if(b+1<length){
if(grid[a][b+1]=='1'&&visited[a][b+1]==0){
queueX.offer(a);
queueY.offer(b+1);
visited[a][b+1]=1;
}
}
}
return;
}
}
BFS求解岛屿数量
本文介绍了一种使用广度优先搜索(BFS)算法解决二维矩阵中岛屿数量问题的方法。通过遍历矩阵,对每个未访问过的陆地进行BFS搜索,标记连接的陆地并计数,最终得到岛屿总数。
949

被折叠的 条评论
为什么被折叠?



