[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 };

 

你可能感兴趣的:(LeetCode)