DFS不一定每次都要从里到外,也可能从外到里  找出边界O然后找到与他相连的标记成A,别的O就是被包围的O。

 1 class Solution {
 2 public:
 3     int n, m;
 4 
 5     void dfs(vector<vector<char>>& board, int x, int y) {
 6         if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') {
 7             return;
 8         }
 9         board[x][y] = 'A';
10         dfs(board, x + 1, y);
11         dfs(board, x - 1, y);
12         dfs(board, x, y + 1);
13         dfs(board, x, y - 1);
14     }
15 
16     void solve(vector<vector<char>>& board) {
17         n = board.size();
18         if (n == 0) {
19             return;
20         }
21         m = board[0].size();
22         for (int i = 0; i < n; i++) {
23             dfs(board, i, 0);
24             dfs(board, i, m - 1);
25         }
26         for (int i = 1; i < m - 1; i++) {
27             dfs(board, 0, i);
28             dfs(board, n - 1, i);
29         }
30         for (int i = 0; i < n; i++) {
31             for (int j = 0; j < m; j++) {
32                 if (board[i][j] == 'A') {
33                     board[i][j] = 'O';
34                 } else if (board[i][j] == 'O') {
35                     board[i][j] = 'X';
36                 }
37             }
38         }
39     }
40 };
View Code