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这道题用BFS解题,思路如下:
第一步:遍历4个bound,把所有的‘O’变成‘1’
第二步:遍历整个数组,把所有的‘O’变成‘X’
第三步:遍历整个数组,把所有的‘1’变成‘O’
代码如下:
public class Solution {
public void solve(char[][] board) {
if (board == null || board.length == 0) {
return;
}
int m = board.length, n = board[0].length;
for (int i = 0; i < m; i ++) {
check(board, i, 0, m, n);
if (n > 1) {
check(board, i, n - 1, m, n);
}
}
for (int j = 1; j < n - 1; j ++) {
check(board, 0, j, m, n);
if (m > 1) {
check(board, m - 1, j, m, n);
}
}
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
if (board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
if (board[i][j] == '1') {
board[i][j] = 'O';
}
}
}
}
private void check(char[][] board, int i, int j, int m, int n) {
if (board[i][j] == 'O') {
board[i][j] = '1';
if (i > 1) check(board, i - 1, j, m, n);
if (i < m - 1) check(board, i + 1, j, m, n);
if (j > 1) check(board, i, j - 1, m, n);
if (j < n - 1) check(board, i, j + 1, m, n);
}
}
}