Given a 2D board containing 'X'
and 'O'
,
capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s
in that surrounded region.
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
題目意思:找出所有被X包圍的O組成的區域,並把這些區域全部替換成X;
解題思路:
1,先從最外圍開始遍歷,將最外圍的O暫時替換成P;然後深搜把與P相鄰的O也替換成P...
2,將O替換成X,P恢復成O
AC代碼:
class Solution {
public:
void solve(vector<vector<char>> &board) {
//如果行或列小於等於2則不包含被包圍的O直接返回
int m = board.size();
if(m <= 2) return;
int n = board[0].size();
if(n <= 2) return;
//先遍歷最上面的那一行
for(int i = 0;i < n;i++){
if(board[0][i] == 'O'){
//標記爲#
board[0][i] = 'P';
dfs(board,0,i,m,n);
}
}
//遍歷最下面那一行
for(int i = 0;i < n;i++){
if(board[m - 1][i] == 'O'){
//標記爲#
board[m - 1][i] = 'P';
dfs(board,m - 1,i,m,n);
}
}
//遍歷最左邊那一行
for(int i = 0;i < m;i++){
if(board[i][0] == 'O'){
//標記爲#
board[i][0] = 'P';
dfs(board,i,0,m,n);
}
}
//遍歷最右邊那一行
for(int i = 0;i < m;i++){
if(board[i][n - 1] == 'O'){
//標記爲#
board[i][n - 1] = 'P';
dfs(board,i,n - 1,m,n);
}
}
//最後遍歷一遍,把O替換成X,把P替換成O
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(board[i][j] == 'O') board[i][j] = 'X';
else if(board[i][j] == 'P') board[i][j] = 'O';
}
}
}
private:
void dfs(vector<vector<char>> &board,int i,int j,int m,int n){
//如果該點的上面的點未到圖的邊緣且爲O繼續遍歷
if(i > 1 && board[i - 1][j] == 'O'){
board[i - 1][j] = 'P';
dfs(board,i - 1,j,m,n);
}
//如果該點的下面的點未到圖的邊緣且爲O繼續遍歷
if(i < m - 1 && board[i + 1][j] == 'O'){
board[i + 1][j] = 'P';
dfs(board,i + 1,j,m,n);
}
//如果該點的左邊的點未到圖的邊緣且爲O繼續遍歷
if(j > 1 && board[i][j - 1] == 'O'){
board[i][j - 1] = 'P';
dfs(board,i,j - 1,m,n);
}
//如果該點的左邊的點未到圖的邊緣且爲O繼續遍歷
if(j < n - 1 && board[i][j + 1] == 'O'){
board[i][j + 1] = 'P';
dfs(board,i,j + 1,m,n);
}
}
};
//解題思路:
//1,先遍歷一遍外圍的點,如果是O替換爲P
//2,遇到O之後深度遍歷O周圍的O也替換爲P
//3,最後一步,將P換回O,將O替換成X