zoukankan      html  css  js  c++  java
  • leetCode130. Surrounded Regions--广度优先遍历算法

    Problem:

    Given a 2D board containing 'X' and 'O' (the letter 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

    /**
     * Created by sunny on 7/24/17.
     */
    import java.util.*;
    public class Solution {
        public  void solve(char[][] board) {
            if (board == null || board.length == 0) {
                return;
            }
            //首先将第一列和最后一列的O变为#
            for(int i = 0;i<board.length;i++){
                //这是按行遍历
                fill(board, i, 0);
                fill(board, i, board[i].length-1);
            }
            //将第一行和最后一行的O变为#
            for (int i = 0; i < board[0].length; i++) {
                fill(board, 0, i);
                fill(board, board.length-1, i);
            }
            //遍历整个数组,o变为X,#变为O
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[i].length; j++) {
                    if (board[i][j] == 'O') {
                        board[i][j] = 'X';
                    }else if(board[i][j] == '#'){
                        board[i][j] ='O';
                    }
                }
            }
        }
        private void fill(char[][] board,int row,int col) {
            if (board[row][col] == 'X') {
                return ;
            }
            board[row][col] = '#';
            Queue<Integer> queue = new LinkedList<>();
            //需要将元素的位置存储到 队列中 行和列
            int code = row * board[0].length + col;
            queue.add(code);
            while(!queue.isEmpty()){
                //找到这个元素
                int temp = queue.poll();
                //第几行
                int i  = temp/board[0].length;
                //第几列
                int j = temp%board[0].length;
                //看这个元素的四个周是不是O,上边
                if(i-1>=0&&board[i-1][j] == 'O'){
                    board[i-1][j] = '#';
                    queue.add((i-1)*board[0].length+j);
                }
                if (i+1<board.length&&board[i+1][j] == 'O') {
                    board[i+1][j] = '#';
                    queue.add((i+1)*board[0].length+j);
                }
                if (j-1>=0&&board[i][j-1] == 'O') {
                    board[i][j-1] = '#';
                    queue.add(i*board[0].length+j-1);
                }
                if (j+1<board[0].length&&board[i][j+1]=='O') {
                    board[i][j+1] = '#';
                    queue.add(i*board[0].length+j+1);
                }
            }
        }
    
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            char[][] board = new char[][]{
                    {'X','X','X','X'},
                    {'X','O','O','O'},
                    {'X','O','X','X'},
                    {'X','X','X','X'}
            };
            Solution solution = new Solution();
            solution.solve(board);
            for(int i=0;i<board.length;i++){
                for(int j=0;j<board[i].length;j++){
                    System.out.print(board[i][j]);
                }
                System.out.println();
            }
        }
    }

    采用广度优先遍历求解。---队列的应用

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/lchzls/p/7233574.html
Copyright © 2011-2022 走看看