zoukankan      html  css  js  c++  java
  • June LeetCoding17 之 二维矩阵的dfs

    首先将dfs代码贴出来。然后再结合leetcode200 Number of Islands 和 leetcode130 Surrounded Regions 这两道题看具体应用

    dfs代码如下:

        public void dfs(char[][] grid, int i, int j){
            if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) return;
            if(grid[i][j] == '1'){
                grid[i][j] = '0';
                dfs(grid, i-1, j);
                dfs(grid, i+1, j);
                dfs(grid, i, j-1);
                dfs(grid, i, j+1);
            }
        }

    leetcode200 是在下面这个矩阵中找有几个‘1’组成的联通分量。对矩阵进行深度搜索,将相连的1都设为0。记录进行了几次深度搜索,即有几个连通分量。

    11110
    11010
    11000
    00000
    class Solution {
        public int numIslands(char[][] grid) {
            if(grid == null || grid.length == 0)
                return 0;
            int res = 0;
            for(int i = 0; i < grid.length; i++){
                for(int j = 0; j < grid[0].length; j++){
                    if(grid[i][j] == '1'){
                        res++;
                        dfs(grid, i, j);
                    }
                }
            }
            return res;
        }
        public void dfs(char[][] grid, int i, int j){
            if(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) return;
            if(grid[i][j] == '1'){
                grid[i][j] = '0';
                dfs(grid, i-1, j);
                dfs(grid, i+1, j);
                dfs(grid, i, j-1);
                dfs(grid, i, j+1);
            }
        }
    }

    leetcode130 同样用到了二维矩阵的深度搜索。

    class Solution {
        public void solve(char[][] board) {
            if(board.length <= 2 || board.length <= 2) return;
            int m = board.length;
            int n = board[0].length;
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if((i == 0 || i == board.length-1 || j == 0 || j == board[0].length-1)&&board[i][j] == 'O')
                        dfs(board, i, j);
                }
            }
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(board[i][j] == 'O') board[i][j] = 'X';
                    if(board[i][j] == '$') board[i][j] = 'O';
                }
            }
        }
        public void dfs(char[][] board, int i, int j){
            if(i < 0 || j < 0 || i >= board.length || j >= board[0].length) return;
            if(board[i][j] == 'O'){
                board[i][j] = '$';
                dfs(board, i-1, j);
                dfs(board, i+1, j);
                dfs(board, i, j-1);
                dfs(board, i, j+1);
            }
        }
    }
  • 相关阅读:
    C语言集锦(一) C代码生成图片:BMP、PNG和JPEG
    Win32 OpenGL标准例子
    Tcc学习笔记(一) 开篇
    C语言集锦(二) 图像显示 Windows和Linux
    矢量图和Word:EPS,PDF,EMF和SVG
    firefox浏览器无法显示bootstrap图标问题总结
    现代字体栈
    jquery 插件大全
    meta 详解,html5 meta 标签日常设置
    工厂方法模式Factory Method(Java实现)
  • 原文地址:https://www.cnblogs.com/yawenw/p/13154602.html
Copyright © 2011-2022 走看看