题目描述
思路分析
d
f
s
dfs
dfs的
F
l
o
o
d
−
F
i
l
l
Flood-Fill
Flood−Fill问题。本质为找连通块。
这道题可以再加一个逆向思维:在边界上的
O
O
O去标记最后不被修改的
O
O
O,其他没被标记的最后都被置成
X
X
X
变量局部改全局,便于操作。
代码实现
class Solution {
public:
int n,m;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
vector<vector<char>> board;
void solve(vector<vector<char>>& _board) {
board=_board;
n=_board.size();
if(!n)return;
m=_board[0].size();
for(int i=0;i<n;i++){
if(board[i][0]=='O') dfs(i,0);
if(board[i][m-1]=='O')dfs(i,m-1);
}
for(int j=0;j<m;j++){
if(board[0][j]=='O')dfs(0,j);
if(board[n-1][j]=='O')dfs(n-1,j);
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(board[i][j]=='#')board[i][j]='O';
else board[i][j]='X';
}
_board=board;
}
void dfs(int x,int y){
board[x][y]='#';
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<n&&b>=0&&b<m&&board[a][b]=='O')dfs(a,b);
}
}
};