被围绕的区域
深度优先搜索
位于边界上的’O’和与其相连的’O’不算被包围。首先,把和边界连接的’O’通过深度优先搜索,换成‘1’或者其他非’X’和‘O’的字符。接下来,一个字符一个字符遍历,把’1’变为’O’,把‘O‘变为’X‘即可。
class Solution {
private:
void DFS(vector<vector<char>>&board,int row,int col) {
if (row < 0 || col < 0 || row >= board.size() || col >= board[0].size())
return;
if ('O' == board[row][col]) {
//把与邻边的'O'相连的'O'都改为'1'
board[row][col] = '1';
//上
DFS(board,row - 1,col);
//下
DFS(board,row + 1,col);
//左
DFS(board,row,col-1);
//右
DFS(board,row,col+1);
}
}
public:
void solve(vector<vector<char>>& board) {
int row = board.size();
int col = board[0].size();
//遍历最上和最下的邻边
for (int i = 0; i < col; i++) {
DFS(board,0,i);
DFS(board,row-1,i);
}
//遍历最左和最右的邻边
for (int i = 1; i < row - 1; i++) {
DFS(board,i,0);
DFS(board,i,col-1);
}
//将真正被包围的岛屿'O'改为'X',没有被包围的岛屿'1'改为'O'
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == '1')
board[i][j] = 'O';
else if (board[i][j] == 'O')
board[i][j] = &#