zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】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

    题解:用的BFS。

        最外围的O肯定是没法变成X的,把这些O推进一个队列里面,然后从它们开始上下左右进行广度优先搜索,它们周围的O也是不用变成X的(因为它有一条突围出去的都是O的路径),然后从周围的点继续广搜......

    实现细节:

    • 用一个visited二维数组记录某个O是否已经进过队列了,这样就不会死循环;
    • 另一个二维数组isX记录哪些点不用变成X,在BFS结束后,把要变成X的点都变成X;
    • 题目中X和O都是大写的=。=

    实现代码如下:

     1 public class Solution {
     2     class co{
     3         int x;
     4         int y;
     5         public co(int x,int y){
     6             this.x = x;
     7             this.y = y;
     8         }
     9     }
    10     public void solve(char[][] board) {
    11         if(board == null || board.length == 0)
    12             return;
    13         int m = board.length;
    14         int n = board[0].length;
    15         boolean[][] visited = new boolean[m][n];
    16         boolean[][] isX = new boolean[m][n];
    17         for(boolean[] row:isX)
    18             Arrays.fill(row, true);
    19         //put all o's cordinates into queue
    20         Queue<co> queue = new LinkedList<co>();
    21         
    22         //first line and last line
    23         for(int i  = 0;i < n;i++)
    24         {
    25             if(board[0][i]=='O'){
    26                 queue.add(new co(0, i));
    27                 visited[0][i]= true; 
    28                 isX[0][i]= false; 
    29             }
    30             if(board[m-1][i]=='O'){
    31                 queue.add(new co(m-1, i));
    32                 visited[m-1][i]= true; 
    33                 isX[m-1][i]= false;
    34             }
    35         }
    36         
    37         //first and last column
    38         for(int j = 0;j<m;j++){
    39             if(board[j][0]=='O'){
    40                 queue.add(new co(j, 0));
    41                 visited[j][0]= true; 
    42                 isX[j][0]= false;
    43             }
    44             if(board[j][n-1]=='O'){
    45                 queue.add(new co(j,n-1));
    46                 visited[j][n-1]= true; 
    47                 isX[j][n-1]= false;
    48             }
    49         }
    50         
    51         while(!queue.isEmpty()){
    52             co c = queue.poll();
    53             //up
    54             if(c.x >= 1 && board[c.x-1][c.y] == 'O'&&!visited[c.x-1][c.y]){
    55                 visited[c.x-1][c.y] = true;
    56                 isX[c.x-1][c.y] = false;
    57                 queue.add(new co(c.x-1, c.y));
    58             }
    59             //down
    60             if(c.x+1<m && board[c.x+1][c.y]=='O' && !visited[c.x+1][c.y]){
    61                 visited[c.x+1][c.y] = true;
    62                 isX[c.x+1][c.y]= false; 
    63                 queue.add(new co(c.x+1, c.y));
    64             }
    65             //left
    66             if(c.y-1>=0 && board[c.x][c.y-1]=='O' && !visited[c.x][c.y-1]){
    67                 visited[c.x][c.y-1] = true;
    68                 isX[c.x][c.y-1] = false;
    69                 queue.add(new co(c.x, c.y-1));
    70             }
    71             //right
    72             if(c.y+1<n && board[c.x][c.y+1] == 'O' && !visited[c.x][c.y+1]){
    73                 visited[c.x][c.y+1] = true;
    74                 isX[c.x][c.y+1] = false;
    75                 queue.add(new co(c.x, c.y+1));
    76             }            
    77         }
    78         for(int i = 0;i < m;i++){
    79             for(int j = 0;j < n;j++){
    80                 if(isX[i][j] )
    81                     board[i][j]= 'X'; 
    82             }
    83         }
    84         return;
    85     }
    86 }
  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3870771.html
Copyright © 2011-2022 走看看