题目描述:
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 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'的连通区域并保存连通区域中每一个字符的位置,
然后遍历该连通区域的字符的位置,如果有字符位于输入2D board的边界上,
那么不对连通区域中的字符'O'进行处理,否则把连通区域中的所有字符'O'改为'X'。
AC代码如下:
class Solution {
public:
void solve(vector<vector<char>>& board) {
int m = board.size();
if (m == 0) return;
int n = board[0].size();
vector<vector<bool>> visited(m, vector<bool>(n, false));
vector<int> positions;
for (int i = 0; i < m; ++i){
for (int j = 0; j < n; ++j){
if (board[i][j] == 'O'&&!visited[i][j]){
int pos = i*n + j;
positions.push_back(pos);
visited[i][j] = true;
int index = 0;
while (!positions.empty()){
int curPos = positions[index];
int flag = 0;
int row = curPos / n;
int col = curPos % n;
if (row - 1 >= 0 && board[row - 1][col] == 'O' && !visited[row - 1][col]){
int tmpPos = (row - 1)*n + col;
positions.push_back(tmpPos);
visited[row - 1][col] = true;
flag = 1;
}
if (row + 1 < m && board[row + 1][col] == 'O' && !visited[row + 1][col]){
int tmpPos = (row + 1)*n + col;
positions.push_back(tmpPos);
visited[row + 1][col] = true;
flag = 1;
}
if (col - 1 >= 0 && board[row][col - 1] == 'O' && !visited[row][col - 1]){
int tmpPos = row*n + col - 1;
positions.push_back(tmpPos);
visited[row][col - 1] = true;
flag = 1;
}
if (col + 1 < n && board[row][col + 1] == 'O' && !visited[row][col + 1]){
int tmpPos = row*n + col + 1;
positions.push_back(tmpPos);
visited[row][col + 1] = true;
flag = 1;
}
if (flag == 1 || index<positions.size()-1){
++index;
}
else{
int flag2 = 0;
for (int k = 0; k < positions.size(); ++k){
int tmpRow = positions[k] / n;
int tmpCol = positions[k] % n;
if (tmpRow == 0 || tmpRow == m - 1 || tmpCol == 0 || tmpCol == n - 1){
flag2 = 1;
break;
}
}
for (int k = 0; k < positions.size(); ++k){
int tmpRow = positions[k] / n;
int tmpCol = positions[k] % n;
if (flag2 == 0)
board[tmpRow][tmpCol] = 'X';
}
positions.clear();
}
}
}
}
}
}
};