leetcode 130 被围绕的区域
一、题目描述
二、解题思路
整体思路
(1)可以采用深度优先搜索(dfs)来解决这个问题;本题实质上是将全部位于内部的连通块染色为'X',但是靠边缘的连通块不能染色。本题正着来思考比较困难,因为无法判断当前连通块是否是完全被包围的;
(2)正难则反,先处理边界位置,将靠边界的连通块染色为'.',如果再搜索到连通块,则一定为被完全包围的连通块,染色为'X'即可。处理完后再将'.'还原为'O'即可。
具体思路
(1)函数功能:dfs函数用于将(i,j)所在的连通块染色为c(其值赋值为c);
(2)函数体:
<1>将当前位置染色为c,board[i][j]=c;
<2>按照上、右、下、左的顺序从当前位置开始探索。如果(x,y)未越界且board[x][y]=='O',就对(x,y)位置递归调用dfs函数。
三、代码实现
class Solution {int m,n;
public:void solve(vector<vector<char>>& board) {//初始化全局变量m=board.size();n=board[0].size();//先处理边界相邻的连通块for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){if(board[i][j]=='O'){if(i==0||i==m-1)dfs(board,i,j,'.');if(j==0||j==n-1)dfs(board,i,j,'.');}}//处理非边界for(int i=0;i!=m;i++)for(int j=0;j!=n;j++)if(i!=0&&i!=m-1&&j!=0&&j!=n-1&&board[i][j]=='O')dfs(board,i,j,'X');//还原边界相邻的连通块for(int i=0;i!=m;i++)for(int j=0;j!=n;j++)if(board[i][j]=='.')board[i][j]='O'; }int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};void dfs(vector<vector<char>>& board,int i,int j,char c){board[i][j]=c;for(int k=0;k!=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O')dfs(board,x,y,c);}}
};