surrounded region

来源:互联网 发布:熹妃传刷元宝软件 编辑:程序博客网 时间:2024/06/05 09:45

http://leetcode.com/oldoj#question_130

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

A region is captured by flipping all 'O'sinto 'X'sin that surrounded region .

For example,

X X X XX O O XX X O XX O X X

After running your function, the board should be:

X X X XX X X XX X X XX O X X

 

中心思想:搜索四个边,如果是'O'尽可能污染到最大范围(说明被污染到的部分无法变'X')

BFS:

    public static void solve(char[][] board) {        int row = board.length;        int col = board[0].length;        for (int i = 0 ; i < board.length; i++) {            pollute(board, 0, i);            pollute(board, row-1, i);        }        for (int i = 0 ; i < board[0].length; i++) {            pollute(board, i, 0);            pollute(board, i, col-1);        }                for (int i = 0; i < row; i++) {            for (int j = 0; j < col; j++) {                if (board[i][j] == 'P') {                    board[i][j] = 'O';                } else if (board[i][j] == 'O') {                    board[i][j] = 'X';                }            }        }    }        static void pollute(char[][] board, int row, int col) {                Queue<Integer> q = new LinkedList<Integer>();        q.offer(row*board[0].length + col);        while (!q.isEmpty()) {            int num = q.poll();            int m = num/board.length;            int n = num%board.length;                        if (m < 0 || m >= board.length || n < 0 || n >= board[0].length || board[m][n] != 'O') {                continue;            }            board[m][n] = 'P';            q.offer((m - 1) * board[0].length + n);            q.offer((m + 1) * board[0].length + n);            q.offer((m) * board[0].length + n-1);            q.offer((m) * board[0].length + n+1);        }    }

DFS,过不了大OJ。

public class Solution {    publicvoid solve(char[][] board) {       if (board == null ||board.length == 0) {          return;       }       for (int i = 0; i <board.length; i++) {          dfs(board, i, 0);          dfs(board, i,board[0].length-1);       }       for (int j = 0; j <board[0].length; j++) {          dfs(board, 0, j);          dfs(board, board.length-1, j);       }       for (int i = 0; i <board.length; i++) {          for (int j = 0; j < board[0].length; j++){              if(board[i][j] == 'P') {                 board[i][j] ='O';              } else{                 board[i][j] ='X';             }          }       }   }    voiddfs(char[][] board, int row, int col) {       if (row < 0 || row >=board.length || col < 0 || col >= board[0].length || board[row][col]!= 'O') {          return;       }       board[row][col] ='P';       dfs(board, row-1,col);       dfs(board, row+1,col);       dfs(board, row,col-1);       dfs(board, row,col+1);   }}

0 0
原创粉丝点击