【牛客网】岛屿数量

题目链接:岛屿数量
题目描述:
给一个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);
                }
            }
        }
    }
}
上一篇:正六边形:判断点是否在正六边形内


下一篇:BFS全球变暖