题目:
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
思路:
这种棋盘方格题目很多都是需要用到深度优先搜索或者广度优先搜索。本题既可以用深度优先搜索,也可以用广度优先搜索,但是由于深度优先搜索实现更为简易,所以我们这里采用深度优先搜索。直接查找所有被X包围的O不是很方便,所以不妨换个思路:找出所有没有被X所包围的O,那么剩下的就是符合题目要求的O了,然后就可以进行修改。凡是处在四个边界上的O以及与之相邻的O都不会被X包围,所以我们采用深度优先搜索,首先将这些元素都临时修改为其它元素(在本实现中我们临时设置它为‘L’),然后遍历方格中的所有元素,如果是O,则修改为X;如果为L,则恢复为O。
代码:
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.size() == 0 || board[0].size() == 0) {
return;
}
int m = board.size();
int n = board[0].size();
for(int i = 0; i < m; ++i) { // left side
if(board[i][0] == 'O')
check(i, 0, board);
}
for(int i = 0; i < m; ++i) { // right side
if(board[i][n-1] == 'O')
check(i, n-1, board);
}
for(int i = 0; i < n; ++i) { // top side
if(board[0][i] == 'O')
check(0, i, board);
}
for(int i = 0; i < n; ++i) { // down side
if(board[m-1][i] == 'O')
check(m-1, i, board);
}
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] == 'L')
board[i][j] = 'O';
}
}
}
private:
void check(int y, int x, vector<vector<char>>& board) {
board[y][x] = 'L';
if(y+1 < board.size() - 1 && board[y+1][x] == 'O') // down
check(y+1, x, board);
if(y-1 > 0 && board[y-1][x] == 'O') // up
check(y-1, x, board);
if(x+1 < board[0].size() - 1 && board[y][x+1] == 'O') // right
check(y, x+1, board);
if(x-1 > 0 && board[y][x-1] == 'O') // left
check(y, x-1, board);
}
};