边界上的O不算被包围的
1.与边界上面的O相连的那些O不是被包围的,所以利用深度搜索将这些与边界相连(包括边界)的O变成*
2.剩下的O就是被包围的,将他们改成X
3.再将*变回O
class Solution { public: void solve(vector<vector<char>> &board) { if(board.size()==0 || board[0].size()==0) return; int ROW = board.size(); int COL = board[0].size(); //深度搜索第一行和最后一行 for(int i = 0 ;i<COL;++i) { dfs(board,0,i,ROW,COL); dfs(board,ROW-1,i,ROW,COL); } //深度搜索第一列和最后一列 for(int i =0;i<ROW;++i) { dfs(board,i,0,ROW,COL); dfs(board,i,COL-1,ROW,COL); } //此时,与边界O相连的O已经变成了 * ,剩下的O就是被X包围的O,将剩下的O变成X for(int i =0;i<ROW;++i) { for(int j =0;j<COL;++j) { if(board[i][j] == 'O') board[i][j] = 'X'; } } //最后将*再变回O for(int i =0;i<ROW;++i) { for(int j =0;j<COL;++j) { if(board[i][j] == '*') board[i][j] = 'O'; } } } //dfs void dfs(vector<vector<char> >& board,int row, int col,int& ROW,int& COL) { if(board[row][col] == 'O') { board[row][col] = '*'; if(row>1) dfs(board,row-1,col,ROW,COL); if(col+1<COL) dfs(board,row,col+1,ROW,COL); if(row+1<ROW) dfs(board,row+1,col,ROW,COL); if(col>1) dfs(board,row,col-1,ROW,COL); } } };