zoukankan      html  css  js  c++  java
  • [leetcode] Surrounded Regions

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.

    A region is captured by flipping all 'O's into 'X's in that surrounded region.

    For example,

    X X X X
    X O O X
    X X O X
    X O X X
    

    After running your function, the board should be:

    X X X X
    X X X X
    X X X X
    X O X X

    https://oj.leetcode.com/problems/surrounded-regions/

    思路:最外圈的‘O’肯定不会被包围,所以从这些‘O'开始dfs或者bfs搜索到的’O‘也不会被包围,最外层处理完毕后,剩下的O变为X即可。

    public class Solution {
    
        public void solve(char[][] board) {
            if (board == null || board.length <= 2 || board[0].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 == m - 1 || j == 0 || j == n - 1) {
                        if (board[i][j] == 'O')
                            bfs(board, i, j, m, n);
                    }
                }
    
            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';
                }
    
        }
    
        private int dir[][] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
    
        void dfs(char[][] board, int i, int j, int m, int n) {
    
            if (i < 0 || j < 0 || i >= m || j >= n)
                return;
            if (board[i][j] != 'O')
                return;
    
            board[i][j] = '$';
    
            for (int k = 0; k < 4; k++) {
                dfs(board, i + dir[k][0], j + dir[k][1], m, n);
            }
    
        }
    
        void bfs(char[][] board, int i, int j, int m, int n) {
            Queue<Integer> queue = new LinkedList<Integer>();
            queue.add(i * n + j);
            board[i][j] = '$';
    
            while (!queue.isEmpty()) {
                int cur = queue.remove();
                int x = cur / n;
                int y = cur % n;
    
                for (int k = 0; k < 4; k++) {
                    int newX = x + dir[k][0];
                    int newY = y + dir[k][1];
                    if (newX >= 0 && newX < m && newY >= 0 && newY < n)
                        if (board[newX][newY] == 'O') {
                            queue.add(newX * m + newY);
                            board[newX][newY] = '$';
                        }
    
                }
    
            }
    
        }
    
        public static void main(String[] args) {
            char[][] board = { "XXX".toCharArray(), "XOX".toCharArray(), "XXX".toCharArray() };
            String s = "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO";
            char[][] board2 = new char[s.length()][s.length()];
            for (int i = 0; i < s.length(); i++) {
                board2[i] = s.toCharArray();
            }
    
            new Solution().solve(board);
        }
    
    }

    第二遍记录:

    dfs总是stackoverflow,有个case比较变态, bfs轻松过。

    public class Solution {
    
        public void solve(char[][] board) {
            if(board==null||board.length<=2||board[0].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||j==0||i==m-1||j==n-1){
                        if(board[i][j]=='O')
                            bfs(board,m,n,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';
                    
                }
                
            }
            
        }
        private int[][] dir={{-1,0},{1,0},{0,-1},{0,1}};
    
        private void bfs(char[][]board, int m,int n,int i,int j){
            Queue<Integer> queue = new LinkedList<Integer>();
            queue.add(i*n+j);
            board[i][j]='$';
            
            while(!queue.isEmpty()){
                int cur = queue.remove();
                int x =cur/n;
                int y =cur%n;
                for(int k=0;k<4;k++){
                    int newX=x+dir[k][0];
                    int newY=y+dir[k][1];
                    if(newX>=0&&newX<m&&newY>=0&&newY<n&&board[newX][newY]=='O'){
                        queue.add(newX*n+newY);
                        board[newX][newY]='$';
                    }
                }
                
            }
            
        }    
        
    
    }

    第三遍记录:

      bfs的时候‘O’变‘$’忘记了,改完就过了。

    public class Solution {
        public void solve(char[][] board) {
            if (board == null || board.length <= 2 || board[0].length <= 2)
                return;
            int n = board.length;
            int m = board[0].length;
            boolean[][] vis = new boolean[n][m];
            // change outside O to $
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {
                        if (board[i][j] == 'O') {
                            bfs(board, i, j, vis);
                        }
                    }
                }
            }
    
            // change O to X
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (board[i][j] == 'O')
                        board[i][j] = 'X';
                }
            }
    
            // change $ back to O
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (board[i][j] == '$')
                        board[i][j] = 'O';
                }
            }
    
        }
    
        private int[][] dir = { { -1, 0 }, { 1, 0 }, { 0, 1 }, { 0, -1 } };
    
        private void bfs(char[][] board, int x, int y, boolean[][] vis) {
            vis[x][y] = true;
            board[x][y]='$';
            int n = board.length;
            int m = board[0].length;
    
            Queue<Integer> queue = new LinkedList<Integer>();
            queue.add(x * m + y);
    
            while (!queue.isEmpty()) {
                Integer out = queue.remove();
                int p = out / m;
                int q = out % m;
    
                for (int i = 0; i < 4; i++) {
                    int np = p + dir[i][0];
                    int nq = q + dir[i][1];
                    if (np >= 0 && np < n && nq >= 0 && nq < m && !vis[np][nq] && board[np][nq] == 'O') {
                        vis[np][nq] = true;
                        board[np][nq]='$';
                        queue.add(np * m + nq);
                    }
                }
    
            }
    
        }
    
    }

    参考:

    http://blog.csdn.net/ojshilu/article/details/22600449

    http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html

  • 相关阅读:
    JavaScript数字精度丢失问题总结
    前端开发调试线上代码的两款工具
    微信公众账号开发入门
    Chrome/Firefox 中头toFixed方法四舍五入兼容性问题
    GIT/node使用
    addEventListener 的另类写法
    JavaScript 动态插入 CSS
    JavaScript判断各浏览器CSS前缀的两种方式
    流程办理操作说明
    流程设计器(2)
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3828778.html
Copyright © 2011-2022 走看看