计数岛屿:深度优先搜索与广度优先搜索

import java.util.*;

public class Main {

    static int n,m;
    static  int [][]graph; //图
    static int [][]visited; //是否访问
    static Deque<int[]> deque; //广搜队列
    //向量
    static int dx[]={-1,0,1,0};
    static int dy[]={0,1,0,-1};

    static int result=0;  //结果
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        graph =new int [n][m];
        visited =new int [n][m];
        deque =new ArrayDeque<>();
        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <m ; j++) {
                graph[i][j]=in.nextInt();
            }
        }
        //遍历图,当找到合法陆地的时候送入搜索逻辑
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <m ; j++) {
                if (graph[i][j]==1&&visited[i][j]!=1)
                {
                    result++;
                    //深搜与广搜二选一
//                     dfs(i,j);  
                        bfs(i,j);
                }
            }
        }
        System.out.println(result);
    }

    //bfs
    static void bfs(int x,int y){
       //初始元素入队
        deque.offer(new int[]{x,y});
        visited[x][y]=1;

        //将节点的上下左右送入队列并判断合法性
        while (!deque.isEmpty()){
            int [] cur=deque.poll();
            for (int i = 0; i <4 ; i++) {
                int nextx=dx[i]+cur[0];
                int nexty=dy[i]+cur[1];
            //发生越界,已访问或者是水地则continue
                if (nextx<0||nextx>=n||nexty<0||nexty>=m||graph[nextx][nexty]==0||visited[nextx][nexty]==1) {
                    continue;
                }
                visited[nextx][nexty]=1;#牛客AI配图神器#
                deque.offer(new int[]{nextx,nexty});
            }
        }
    }
    //递归逻辑,找到相连的陆地并标记访问过,直到碰到水和访问过的陆地则返回
    static void dfs(int x,int y){
    //当碰到水或者已经是拜访过的陆地就终止
        if(visited[x][y]==1||graph[x][y]==0){
            return;
        }
        visited[x][y]=1;
        for (int i = 0; i <4; i++) {
            int nextx=dx[i]+x;
            int nexty=dy[i]+y;
            if(nextx<0||nextx>=n||nexty<0||nexty>=m){
                continue;
            }
            dfs(nextx,nexty);
            //由于并不需要记录路径,所以不需要回溯
        }
    }

}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务