zoukankan      html  css  js  c++  java
  • 1559. 二维网格图中探测环(并查集,dfs)

       方法一:记忆化dfs

    class Solution {
        boolean[][] visited;
        public boolean containsCycle(char[][] grid) {
            int m = grid.length, n = grid[0].length;
            visited = new boolean[m][n];
            for(boolean[] v : visited) Arrays.fill(v,false);
            if(m < 2 || n < 2) return false;
            for(int i = 0; i < m; i++) {
                for(int j = 0; j < n; j++) {
                    if(grid[i][j] == '.') continue;
                    if(dfs(grid,i,j,m,n,grid[i][j],-1,-1)) return true;
                }
            }
            return false;
        }
        int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
        public boolean dfs(char[][] grid, int i, int j, int m, int n, char pre, int prex, int prey) {
            if(i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != pre) return false;
            if(visited[i][j]) return true;
            visited[i][j] = true;
            for(int k = 0; k < 4; k++) {
                if(i + dir[k][0] == prex && j + dir[k][1] == prey) continue;
                if(dfs(grid,i+dir[k][0],j+dir[k][1],m,n,pre,i,j)) return true;
            }
            visited[i][j] = false;
            grid[i][j] = '.';
            return false;
        }
    }

      方法二:并查集

    class Solution {
        int[] p;
        public boolean containsCycle(char[][] grid) {
            int m = grid.length, n = grid[0].length;
            p = new int[m*n];
            for(int i = 0; i < n * m; i++) {
                p[i] = i;
            }
            for(int i = 0; i < m; i++) {
                for(int j = 0; j < n; j++) {
                    char c = grid[i][j];
                    if(i + 1 < m && grid[i+1][j] == c) {
                        if(union(i*n+j,(i+1)*n+j)) return true;
                    }
                    if(j + 1 < n && grid[i][j+1] == c) {
                        if(union(i*n+j,i*n+j+1)) return true;
                    }
                }
            }
            return false;
        }
        public int find(int x) {
            if(x != p[x]) p[x] = find(p[x]);
            return p[x];
        }
        public boolean union(int a, int b) {
            int fa = find(a), fb = find(b);
            if(fa != fb) {
                p[fa] = fb;
                return false;
            }
            return true;
        }
    }
  • 相关阅读:
    struts的action直接输出中文备注【原创】
    iframe高度处理【原创】
    Gel备注【原创】
    关于用jsp生成xml的问题【原创】
    网上流行的flash切换图片之研究【原创】
    c#连mysql的latin1编码乱码问题
    windows phone 7图片搜索小工具(源码)
    家猫js类库
    理解c#中的readonly,const与enum枚举
    Silverlight 雷达图和一种特殊泡泡画法
  • 原文地址:https://www.cnblogs.com/yonezu/p/13572756.html
Copyright © 2011-2022 走看看