Skip to content

Latest commit

 

History

History
43 lines (42 loc) · 1.51 KB

areasurrounded.md

File metadata and controls

43 lines (42 loc) · 1.51 KB

题目描述:
image
解决过程:
我本来以为可以单独判断每个大O字母是不是被X包围—只要上下左右都可以找到有效的X就可以了,后面发现不是这样的,因为从边界衍生出来的大O字母就算上下左右都可以找到X也不是被X包围的。
看了题解,发现只要从边界开始深度优先搜索然后就可以把没有被X包围的O全部找出来,剩下的就是被X包围的了。细节见代码
代码:

class Solution {
public:
    int m , n;
    void dfs(vector<vector<char>>& board, int x, int y) {
        if (x < 0 || x >= m || y < 0 || y >= n) return;
        if (board[x][y] == 'X' || board[x][y] == 'A') return;
        board[x][y] = 'A';
        dfs(board,x,y-1);
        dfs(board,x,y+1);
        dfs(board,x-1,y);
        dfs(board,x+1,y);
    }

    void solve(vector<vector<char>>& board) {
        m = board.size();
        n = board[0].size();
        for (int i = 0; i < m; i++) {
            dfs(board,i,0);
            dfs(board,i,n-1);
        }
        for (int i = 1; i < n - 1; i++) {
            dfs(board,0,i);
            dfs(board,m-1,i);
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'A') {
                    board[i][j] = 'O';
                } else if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                }
            }
        }
    }
 };