基本思想:
个人没想到可以根据边界进行从外向里遍历;
如果从外向里遍历,只需要标记边界相连的所有块,最后一次性遍历,将标记块复原,非标记块恢复即可;
如果从内向外遍历,还要记录遍历失败之后的访问记录,避免多次重复遍历,工作量巨大;
总体代码:
class Solution {
public:
void dfs(int m,int n,int x,int y,vector<vector<char>>& board){
if(x<0||x>=m||y<0||y>=n||board[x][y]!='O')
return;
board[x][y]='A';
dfs(m,n,x+1,y,board);
dfs(m,n,x-1,y,board);
dfs(m,n,x,y+1,board);
dfs(m,n,x,y-1,board);
}
void solve(vector<vector<char>>& board) {
int m=board.size();
int n=board[0].size();
for(int i=0;i<n;i++){
//遍历第一行和最后一行;
dfs(m,n,0,i,board);
dfs(m,n,m-1,i,board);
}
for(int i=0;i<m;i++){
//遍历第一列和最后一列;
dfs(m,n,i,0,board);
dfs(m,n,i,n-1,board);
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='A')
board[i][j]='O';
else if(board[i][j]=='O')
board[i][j]='X';
}
}
}
};