题目链接:岛屿数量
题目描述:
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
样例:
输入:
[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
输出:
3
数据范围:01矩阵范围<=200*200
思路:dfs或者bfs消除同一连通块中的标记。
dfs代码:
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve (char[][] grid) {
int ans=0;
int dir[][]={{1,0},{-1,0},{0,1},{0,-1}};
boolean vis[][]=new boolean[grid.length][grid[0].length];
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
vis[i][j]=false;
}
}
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1'&&!vis[i][j]){
vis[i][j]=true;
ans++;
dfs(grid,i,j,vis,dir);
}
}
}
return ans;
}
public void dfs(char a[][],int x,int y,boolean vis[][],int dir[][]){
if(x>=a.length||x<0||y>=a[0].length||y<0) return;//出界
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx>=0&&dx<a.length&&dy>=0&&dy<a[0].length&&a[dx][dy]=='1'&&!vis[dx][dy]){
vis[dx][dy]=true;
dfs(a,dx,dy,vis,dir);
}
}
}
}
bfs代码:
import java.util.*;
public class Solution {
class Node{
int x;
int y;
}
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve (char[][] grid) {
int ans=0;
int dir[][]={{1,0},{-1,0},{0,1},{0,-1}};
boolean vis[][]=new boolean[grid.length][grid[0].length];
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
vis[i][j]=false;
}
}
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1'&&!vis[i][j]){
vis[i][j]=true;
ans++;
bfs(grid,i,j,vis,dir);
}
}
}
return ans;
}
public void bfs(char a[][],int x,int y,boolean vis[][],int dir[][]){
Queue<Node> queue=new LinkedList<Node>();
Node node=new Node();
node.x=x;
node.y=y;
queue.add(node);
vis[x][y]=true;
while(!queue.isEmpty()){
Node cur=queue.poll();
for(int i=0;i<4;i++){
int dx=cur.x+dir[i][0];
int dy=cur.y+dir[i][1];
if(dx>=0&&dx<a.length&&dy>=0&&dy<a[0].length&&a[dx][dy]=='1'&&!vis[dx][dy]){
Node next=new Node();
next.x=dx;
next.y=dy;
vis[dx][dy]=true;
queue.add(next);
}
}
}
}
}