先把与边界连通的找出来 在找那些被封闭的 dfs结局方案:
class Solution {
int check(vector<vector<char>> board,int i,int j){
int r=board.size();
int c=board[0].size();
if(i==0 || i==r-1 ||j==0 || j==c-1){
return 1;
}
return 0;
}
void dfs1(vector<vector<char>>& board,int i,int j){
int r=board.size();
int c=board[0].size();
if(i<0 ||i>=r ||j<0 ||j>=c){
return ;
}
if(board[i][j]=='O'){
board[i][j]='#';
}
else if(board[i][j]=='#' || board[i][j]=='X'){
return ;
}
dfs1(board,i+1,j);
dfs1(board,i-1,j);
dfs1(board,i,j+1);
dfs1(board,i,j-1);
}
void dfs2(vector<vector<char>>& board,int i,int j){
int r=board.size();
int c=board[0].size();
if(i<0 ||i>=r ||j<0 ||j>=c){
return ;
}
if(board[i][j]=='O'){
board[i][j]='X';
}
else if(board[i][j]=='#' || board[i][j]=='X'){
return ;
}
dfs2(board,i+1,j);
dfs2(board,i-1,j);
dfs2(board,i,j+1);
dfs2(board,i,j-1);
}
public:
void solve(vector<vector<char>>& board) {
int r=board.size();
int c=board[0].size();
for(int i =0;i<r;i++){
for(int j=0;j<c;j++){
if(board[i][j]=='O' && check(board,i,j)==1){
dfs1(board,i,j);
}
}
}
for(int i =0;i<r;i++){
for(int j=0;j<c;j++){
if(board[i][j]=='O' && check(board,i,j)==0){
dfs2(board,i,j);
}
}
}
for(int i =0;i<r;i++){
for(int j=0;j<c;j++){
if(board[i][j]=='#' ){
board[i][j]='O';
}
}
}
}
};