zoukankan      html  css  js  c++  java
  • 130. Surrounded Regions

     1 class Solution {
     2     public void solve(char[][] board) {
     3         if(0==board.length||0==board[0].length)return;
     4         if(board.length<2||board[0].length<2)return;
     5         
     6         int height=board.length;
     7         int width=board[0].length;
     8         for(int i=0;i<height;++i)
     9         {
    10             if('O'==board[i][0])
    11                 boundary(board,i,0);
    12             if('O'==board[i][width-1])
    13                 boundary(board,i,width-1);
    14         }
    15         
    16         for(int j=0;j<width;++j)
    17         {
    18             if('O'==board[0][j])
    19                 boundary(board,0,j);
    20             if('O'==board[height-1][j])
    21                 boundary(board,height-1,j);
    22         }
    23         
    24         for(int i=0;i<height;++i)
    25             for(int j=0;j<width;++j)
    26                 if(board[i][j]=='O')
    27                     board[i][j]='X';
    28                 else if(board[i][j]=='*')
    29                     board[i][j]='O';
    30     }
    31     
    32     void boundary(char [][]board, int i, int j)
    33     {
    34         if(i<0||i>board.length-1||j<0||j>board[0].length-1)
    35             return;
    36         if('O'==board[i][j])
    37             board[i][j]='*';
    38         if(i>1&&board[i-1][j]=='O')
    39             boundary(board,i-1,j);
    40         if(i<board.length-2&&board[i+1][j]=='O')
    41             boundary(board,i+1,j);
    42         if(j>1&&board[i][j-1]=='O')
    43             boundary(board,i,j-1);
    44         if(j<board[i].length-2&&board[i][j+1]=='O')
    45             boundary(board,i,j+1);
    46     }
    47 }

    dfs问题. 来自讨论区答案

    X包围O, 包围的部分用X更新, 边界不算包围, 所以思路是从四条边开始找O, 把O替换为* 进行染色, 染色完之后剩下的O自然就是要被更新为X的部分. 再把*还原

    注意几个问题

    1 这题没说是否可以修改原数组, java给的是数组没有final修饰, cpp给的是引用参数, 都可以修改, 理论上讲用了额外空间0(n).

    2 如何fs? 四个方向,哪个方向有O就往哪边走

    3 其实思路没有什么特别难的,但是这种问题写出代码就是一大堆,确实有点恼火, 而且四个方向, i和j, 注意不要搞混, 如果写错了调试起来有点头疼

  • 相关阅读:
    python_网络编程struct模块解决黏包问题
    python_网络编程socket(UDP)
    python_网络编程socket(TCP)
    python_面向对象
    python_生成器
    python_迭代器
    linux实操_shell自定义函数
    linux实操_shell系统函数
    linux实操_shell读取控制台输入
    scrapy-redis 0.6.8 配置信息
  • 原文地址:https://www.cnblogs.com/lychnis/p/11110788.html
Copyright © 2011-2022 走看看