• 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();
            }
        }
    }

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

  • 相关阅读:
    绿色版Notepad++ 加右键带图标菜单
    C#中string和StringBuilder的区别
    C#中string和String的区别
    C#中is和as的区别
    C#中抽象类(abstract)和接口(interface)的相同点与区别
    c++串口通信实例
    vs2017常用快捷键
    Qt编译opencv找不到头文件
    Qt常用快捷键
    二维数组和指针
  • 原文地址:https://www.cnblogs.com/lchzls/p/7233574.html
Copyright © 2020-2023  润新知