[Leetcode] Surrounded Regions

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

先将所有外围的‘O’标记为‘.’,再将内部的‘O’标记成‘X’并且恢复外围的‘.’为‘O’。注意DFS时最外面的一圈已经在最开始处理过了,所以DFS时无需再进入了,否则会报内存错误。

DFS:

 1 class Solution {
 2 public:
 3     void dfs(vector<vector<char>> &board, int x, int y) {
 4         board[x][y] = '#';
 5         const int dx[4] = {0, 1, 0, -1};
 6         const int dy[4] = {1, 0, -1, 0};
 7         for (int i = 0; i < 4; ++i) {
 8             int xx = x + dx[i], yy = y + dy[i];
 9             if (xx > 0 && xx < board.size() - 1 && yy > 0 && yy < board[0].size() - 1 && board[xx][yy] == 'O') 
10                 dfs(board, xx, yy);
11         }
12     }
13     void solve(vector<vector<char>>& board) {
14         if (board.empty() || board[0].empty()) return;
15         int N = board.size(), M = board[0].size();
16         for (int i = 0; i < N; ++i) {
17             if (board[i][0] == 'O') dfs(board, i, 0);
18             if (board[i][M-1] == 'O') dfs(board, i, M-1);
19         }
20         for (int j = 0; j < M; ++j) {
21             if (board[0][j] == 'O') dfs(board, 0, j);
22             if (board[N-1][j] == 'O') dfs(board, N-1, j);
23         }
24         for (int i = 0; i < N; ++i) {
25             for (int j = 0; j < M; ++j) {
26                 if (board[i][j] == '#') board[i][j] = 'O';
27                 else if (board[i][j] == 'O') board[i][j] = 'X';
28             }
29         }
30         return;
31     }
32 };

BFS:

 1 class Solution {
 2 public:
 3     void solve(vector<vector<char>>& board) {
 4         if (board.empty() || board[0].empty()) return;
 5         int N = board.size(), M = board[0].size();
 6         queue<pair<int, int>> que;
 7         for (int i = 0; i < N; ++i) {
 8             if (board[i][0] == 'O') que.push({i, 0});
 9             if (board[i][M-1] == 'O') que.push({i, M-1});
10         }
11         for (int j = 0; j < M; ++j) {
12             if (board[0][j] == 'O') que.push({0, j});
13             if (board[N-1][j] == 'O') que.push({N-1, j});
14         }
15         const int dx[4] = {0, 1, 0, -1};
16         const int dy[4] = {1, 0, -1, 0};
17         for (; !que.empty(); que.pop()) {
18             auto u = que.front();
19             int x = u.first, y = u.second;
20             board[x][y] = '#';
21             for (int i = 0; i < 4; ++i) {
22                 int xx = x + dx[i], yy = y + dy[i];
23                 if (xx >= 0 && xx < N && yy >= 0 && yy < M && board[xx][yy] == 'O') que.push({xx, yy});
24             }
25         }
26         for (int i = 0; i < N; ++i) {
27             for (int j = 0; j < M; ++j) {
28                 if (board[i][j] == '#') board[i][j] = 'O';
29                 else if (board[i][j] == 'O') board[i][j] = 'X';
30             }
31         }
32         return;
33     }
34 };
原文地址:https://www.cnblogs.com/easonliu/p/3680630.html