岛屿问题:高山流水

import javax.xml.transform.Result;
import java.util.Arrays;
import java.util.Scanner;

//若从每个点开始搜索,会导致时间复杂度过高,可以逆向思考,只从边界出发,看看能到达哪些点,能到达的点标记为访问
//从两个边界出发,用两个数组存各自能到达的节点,两个都到达的节点则是答案节点

public class Main {
    static int n,m;
    static int[][] graph;

    static int [] dx={1,0,-1,0};
    static int [] dy={0,1,0,-1};

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        graph = new int[n][m];
        
//    两个边界的visited数组
        int[][] first =new int[n][m];
        int[][] second=new int[n][m];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                graph[i][j] = in.nextInt();
            }
        }

    //遍历行
        for (int i = 0; i <m ; i++) {
            dfs(first,0,i);
            dfs(second,n-1,i);
        }
//    遍历列
        for (int i=0;i<n;i++){
            dfs(first,i,0);
            dfs(second,i,m-1);
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (second[i][j]==1&&first[i][j]==1) {
                    System.out.println(i+" "+j);
                }
            }
        }
    }

    static void dfs( int [][]visited,int x,int y) {
        if (visited[x][y] == 1) {
            return;
        }
        visited[x][y] = 1;

        for (int i = 0; i < 4; i++) {
            int nextx = x + dx[i];
            int nexty = y + dy[i];
//        若下一个节点的高度小于当前节点的高度,则continue
            if (nextx < 0 || nexty < 0 || nexty >= m || nextx >= n || graph[nextx][nexty] < graph[x][y]) {
                continue;
            }
            dfs(visited, nextx, nexty);
        }
    }
}
全部评论

相关推荐

哞客37422655...:这就是真实社会,没有花里胡哨的安慰,让你感受到阶级分明,不浪费彼此时间。虽然露骨但是唉
点赞 评论 收藏
分享
01-08 12:01
门头沟学院 Java
冰炸橙汁_不做oj版:不接好运
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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