130. Surrounded Regions

来源:互联网 发布:数据库pdforacle网盘 编辑:程序博客网 时间:2024/05/01 11:06

Given a 2D board containing 'X' and 'O' (the letter 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 XX O O XX X O XX O X X

After running your function, the board should be:

X X X XX X X XX X X XX O X X



题目要求将被‘X‘围住的’O‘区域中的‘O‘全改成‘X‘。观察发现如果一块‘O‘区域能延伸到边缘则表示没有没围住,所以可以从边缘的‘O‘开始做dfs,找出包含该‘O‘点的区域,这些区域是不用变成‘X‘的,为了与其它的‘O‘区别开来,先把这些’O‘改成‘Q‘。最后对二维表进行遍历,将‘O‘改成‘X‘,’Q‘改称’O‘。


代码:

class Solution{public:void solve(vector<vector<char> >& board) {m = board.size();if(m == 0) return;n = board[0].size();if(n == 0) return;for(int i = 0; i < m; ++i){dfs(board, i, 0);dfs(board, i, n - 1);}for(int j = 1; j < n - 1; ++j){dfs(board, 0, j);dfs(board, m - 1, j);}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(board[i][j] == 'O') board[i][j] = 'X';else if(board[i][j] == 'Q') board[i][j] = 'O';}}}private:int m, n;void dfs(vector<vector<char> >& board, int i, int j){if(board[i][j] != 'O') return;board[i][j] = 'Q';if(i > 1 && board[i-1][j] == 'O') dfs(board, i-1, j);if(i < m - 2 && board[i+1][j] == 'O') dfs(board, i+1, j);if(j > 1 && board[i][j-1] == 'O') dfs(board, i, j-1);if(j < n - 2 && board[i][j+1] == 'O') dfs(board, i, j+1);}};


0 0
原创粉丝点击