• 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

  • 相关阅读:
    梦断代码阅读笔记03
    学习进度条十五
    梦断代码阅读笔记02
    构建执法阅读笔记06(总结)
    学习进度条十四
    冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱
    冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱
    HDU 3555:Bomb
    NOIp2012:借教室
    HNOI 2012/codevs 1994:排队
  • 原文地址:https://www.cnblogs.com/yuzhangcmu/p/4132093.html
Copyright © 2020-2023  润新知