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, 注意不要搞混, 如果写错了调试起来有点头疼

  • 相关阅读:
    IDEA常用快捷指令整理
    Python dict 字典
    内联函数
    【MFC】编辑框 CEdit Ctrl控件自动换行设置
    mysql 多sql文件恢复方案
    Linux: 用64位的系统,能编译32位的程序吗?
    C++ 遍历数组
    工业现场传感器传感器为什么采用电流形式输出?
    【转】电磁阀、电磁铁的工作原理说明
    PCB板强弱电隔离距离不够导致损坏和问题检查记录
  • 原文地址:https://www.cnblogs.com/lychnis/p/11110788.html
Copyright © 2011-2022 走看看