surrounded regions

来源:互联网 发布:游族网络股票千股千评 编辑:程序博客网 时间:2024/06/16 07:55

题目描述

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

思路

对于二维数组中的任何一个字符O,沿着它的四个方向找一条到O的路径,如果能够到达边缘的O,则说明它不是被X包围的。对于边缘的O一定不是被X包围的。

解法一:DFS

public class Solution5 {    public void solve(char[][] board) {        for(int i=0; i<board.length;++i){            for(int j=0;j<board[i].length;++j){                if((i==0 || i == board.length-1 || j==0|| j==board[i].length-1) && board[i][j]=='O'){//注意这个条件判断,我们需要从数组边缘开始找,如果找到,则沿着四个方向DFS                    solveDFS(board, i, j);                }            }        }        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';                if (board[i][j] == '$') board[i][j] = 'O';            }        }        for(int i=0; i<board.length;++i){            for(int j=0;j<board[i].length;++j){                System.out.println(board[i][j]);            }        }    }    private void solveDFS(char[][] board, int i, int j) {           if (board[i][j] == 'O') {            board[i][j] = '$';//将不被包围的'O'用'$'代替        if(i>0 && board[i-1][j] == 'O')            solveDFS(board, i-1, j);        if(j<board[i].length-1 && board[i][j+1]=='O')            solveDFS(board, i, j+1);        if(i<board.length-1 && board[i+1][j] == 'O')            solveDFS(board, i+1, j);        if(j>0 && board[i][j-1]=='O')            solveDFS(board, i, j-1);        }    }    public static void main(String[] args) {        char[][] board = {                {'X', 'X', 'X','X'},                {'X', 'O', 'O' ,'X'},                {'X', 'X', 'O', 'X'},                {'X' ,'O' ,'X' ,'X'}            };        new Solution5().solve(board);       }}

解法二:BFS

import java.util.HashMap;import java.util.LinkedList;import java.util.Map;import java.util.Queue;import javax.management.Query;public class Solution5_1 {    public void solve(char[][] board){        int row = board.length;//数组的行数        if(row==0){//board={},避免报空指针异常            return;        }        int col = board[0].length;//数组的列数               Queue queue = new LinkedList<Pair>();        boolean[][] b = new boolean[row][col];//b[i][j]=true表示(i,j)为'O'并且不被包围        //从第一行遍历        for(int j=0;j<col;j++)            if(board[0][j]=='O'){                queue.add(new Pair(0,j));                   b[0][j] = true;            }        //第一列        for(int j=0;j<row;j++){            if(board[j][0] == 'O'){                queue.add(new Pair(j,0));                b[j][0] = true;            }        }        //最后一行        for(int j=0;j<col;j++){            if(board[row-1][j] == 'O'){                queue.add(new Pair(row-1,j));                b[row-1][j] = true;            }        }        //最后一列        for(int j=0;j<row;j++){            if(board[j][col-1] == 'O'){                queue.add(new Pair(j,col-1));                b[j][col-1] = true;            }        }        while(!queue.isEmpty()){            Pair pair = (Pair) queue.poll();            int i = pair.getI();            int j = pair.getJ();            if(i-1>0 && board[i-1][j]=='O' && b[i-1][j]==false){                b[i-1][j]=true;                queue.add(new Pair(i-1,j));            }            if(i+1<row-1 && board[i+1][j]=='O' && b[i+1][j]==false){                b[i+1][j]=true;                queue.add(new Pair(i+1,j));            }            if(j-1>0 && board[i][j-1]=='O' && b[i][j-1]==false){                b[i][j-1]=true;                queue.add(new Pair(i,j-1));            }            if(j+1<col-1 && board[i][j+1]=='O'&& b[i][j+1]==false){                b[i][j+1]=true;                queue.add(new Pair(i,j+1));            }        }         //Get result        for (int i=0;i<row;i++){            for (int j=0;j<col;j++){                if (board[i][j]=='O' && b[i][j]==false){                    board[i][j]='X';                }            }        }        for(int i=0; i<board.length;++i){            for(int j=0;j<board[i].length;++j){                System.out.println(board[i][j]);            }        }    }    class Pair{        public  int i;        public  int j;        public Pair(int i, int j){            this.i=i;            this.j=j;        }        public int getI(){            return this.i;        }        public int getJ(){            return this.j;        }    }    public static void main(String[] args) {        char[][] board = {                {'X', 'X', 'X','X'},                {'X', 'O', 'O' ,'X'},                {'X', 'X', 'O', 'X'},                {'X' ,'O' ,'X' ,'X'}            };        new Solution5_1().solve(board);    }}
0 0