2020年9月27日 周日 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
本题可直接在原数组上进行修改,而不用建立visited
访问数组。
具体做法是先通过DFS
或BFS
把四周连接在一起的'O'
都替换为其它字符(比如'A'
),然后遍历整个数组,将'O'
替换成'X'
,'A'
替换成'O'
即可。
1. DFS
熟练掌握图的dfs
迭代版和递归版代码的书写。
1.1 递归版
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.empty()) return;
int m = board.size();
int n = board[0].size();
// 如果四周有'0',进行dfs,找到所有连接的'0'
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(i==0 || j==0 || i==m-1 || j==n-1){
if(board[i][j]=='O')
dfs(board,i,j);
}
}
}
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
// 如果是'A',说明是四周连接在一起的'O',还原为'O'
if(board[i][j]=='A') board[i][j] = 'O';
// 如果还是'O',说明这是被'X'包围的'O',所以替换为'X'
else if(board[i][j]=='O') board[i][j] = 'X';
}
}
}
// 递归版dfs
void dfs(vector<vector<char>>& board, int i, int j){
if(i<0 || j<0 || i>=board.size() || j>=board[0].size() || board[i][j]!='O') return;