Surrounded regions

题意:假设一个二维图由X和O组成,将所有被X围住的O转换成X
如:XXXX
       XOOX
       XXOX
       XOXX
变成:XXXX
          XXXX
          XXXX
          XOXX

思路:从O处开始BFS,用一个队列记录遍历的路径,如果这条路径都是在边界以内,则将路径上所有的O变成X
代码:
               void solve ( vector < vector < char >> & board ) {
 
 
         // Start typing your C/C++ solution below
         // DO NOT write int main() function
        
         int N = board . size ();
         if ( N == 0 ) return ;
         int M = board [ 0 ]. size ();
         if ( M == 0 ) return ;
         vector < vector < bool > > mark ( N , vector < bool > ( M , false ));
        
         int dx [ 4 ] = { - 1 , 1 , 0 , 0 };//上下左右四个方向
         int dy [ 4 ] = { 0 , 0 , - 1 , 1 };
        
         for ( int i = 0 ; i < N ; i ++ )
             for ( int j = 0 ; j < M ; j ++ )
             {
                 if ( ! mark [ i ][ j ] && board [ i ][ j ] == 'O' )
                 {
                     vector < int > queX , queY ;//遍历路径
                     queX . push_back ( i );
                     queY . push_back ( j );
                     mark [ i ][ j ] = true ;
                     int head = 0 ;
                     bool result = ! ( i == 0 || j == 0 || i == N - 1 || j == M - 1 ) ;//是否在边界以内
                    
                     while ( head < queX . size ())
                     {
                         int nx = queX [ head ];
                         int ny = queY [ head ];
                         head ++ ;
                         for ( int i = 0 ; i < 4 ; i ++ )
                         {
                             int nextX = nx + dx [ i ];
                             int nextY = ny + dy [ i ];
                             if ( nextX >= 0 && nextX < N && nextY >= 0 && nextY < M )
                             {
                                 if ( ! mark [ nextX ][ nextY ] && board [ nextX ][ nextY ] == 'O' )
                                 {
                                     mark [ nextX ][ nextY ] = true ;
                                     queX . push_back ( nextX );
                                     queY . push_back ( nextY );
                                     if ( nextX == 0 || nextY == 0 || nextX == N - 1 || nextY == M - 1 ) //遍历到了边界
                                         result = false ;
                                 }
                             }
                         }
                     }
                     if ( result )
                     {
                         for ( int i = 0 ; i < queX . size (); i ++ )
                             board [ queX [ i ]][ queY [ i ]] = 'X' ;
                     }
                 }
             }
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值