LeetCode: Surrounded Regions 解题报告

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

SOLUTION 1:

经典 BFS 题目。如果使用DFS,会超时。

使用队列进行BFS。注意,在判断index越界时,主页君写了2种方法。

(1)可以直接对index在0-x*y之间取。这里有个小的trick,在点在左边缘的时候,index-1会导致我们回到上一行的最右边。当然那个点也是

       边缘点,所以不会造成解的错误。

(2)判断点是不是在边缘,判定上下左右还有没有节点。

常出错的点:计算index是i * cols + j  这点要记好了。

  1 public class Solution {
  2     public void solve(char[][] board) {
  3         if (board == null || board.length == 0 || board[0].length == 0) {
  4             return;
  5         }
  6         
  7         int rows = board.length;
  8         int cols = board[0].length;
  9         
 10         // the first line and the last line.
 11         for (int j = 0; j < cols; j++) {
 12             bfs(board, 0, j);
 13             bfs(board, rows - 1, j);
 14         }
 15         
 16         // the left and right column
 17         for (int i = 0; i < rows; i++) {
 18             bfs(board, i, 0);
 19             bfs(board, i, cols - 1);
 20         }
 21         
 22         // capture all the nodes.
 23         for (int i = 0; i < rows; i++) {
 24             for (int j = 0; j < cols; j++) {
 25                 if (board[i][j] == 'O') {
 26                     board[i][j] = 'X';
 27                 } else if (board[i][j] == 'B') {
 28                     board[i][j] = 'O';
 29                 }
 30             }
 31         }
 32         
 33         return;
 34     }
 35     
 36     public void bfs1(char[][] board, int i, int j) {
 37         int rows = board.length;
 38         int cols = board[0].length;
 39         
 40         Queue<Integer> q = new LinkedList<Integer>();
 41         q.offer(i * cols + j);
 42         
 43         while (!q.isEmpty()) {
 44             int index = q.poll();
 45             
 46             // Index is out of bound.
 47             if (index < 0 || index >= rows * cols) {
 48                 continue;
 49             }
 50             
 51             int x = index / cols;
 52             int y = index % cols;
 53             
 54             if (board[x][y] != 'O') {
 55                 continue;
 56             }
 57             
 58             board[x][y] = 'B';
 59             q.offer(index + 1);
 60             q.offer(index - 1);
 61             q.offer(index + cols);
 62             q.offer(index - cols);
 63         }
 64     }
 65     
 66     public void bfs(char[][] board, int i, int j) {
 67         int rows = board.length;
 68         int cols = board[0].length;
 69         
 70         Queue<Integer> q = new LinkedList<Integer>();
 71         q.offer(i * cols + j);
 72         
 73         while (!q.isEmpty()) {
 74             int index = q.poll();
 75             
 76             int x = index / cols;
 77             int y = index % cols;
 78             
 79             if (board[x][y] != 'O') {
 80                 continue;
 81             }
 82             
 83             board[x][y] = 'B';
 84             if (y < cols - 1) {
 85                 q.offer(index + 1);    
 86             }
 87             
 88             if (y > 0) {
 89                 q.offer(index - 1);    
 90             }
 91             
 92             if (x > 0) {
 93                 q.offer(index - cols);    
 94             }
 95             
 96             if (x < rows - 1) {
 97                 q.offer(index + cols);    
 98             }
 99         }
100     }
101 }
View Code

SOLUTION 2:

附上DFS解法:

 1 public void dfs(char[][] board, int i, int j) {
 2         int rows = board.length;
 3         int cols = board[0].length;
 4         
 5         // out of bound or visited.
 6         if (i < 0 || i >= rows || j < 0 || j >= cols) {
 7             return;
 8         }
 9         
10         if (board[i][j] != 'O') {
11             return;
12         }
13         
14         board[i][j] = 'B';
15         
16         // dfs the sorrounded regions.
17         dfs(board, i + 1, j);
18         dfs(board, i - 1, j);
19         dfs(board, i, j + 1);
20         dfs(board, i, j - 1);
21     }
View Code

GITHUB:

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/bfs/Solve.java

posted on 2014-11-29 22:08  Yu's Garden  阅读(1174)  评论(0编辑  收藏  举报

导航