http://leetcode.com/oldoj#question_130
Given a 2D board containing 'X'
'O'
,capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
sinto 'X'
sin 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'尽可能污染到最大范围(说明被污染到的部分无法变'X')
BFS:
public static void solve(char[][] board) {
int row = board.length;
int col = board[0].length;
for (int i = 0 ; i < board.length; i++) {
pollute(board, 0, i);
pollute(board, row-1, i);
}
for (int i = 0 ; i < board[0].length; i++) {
pollute(board, i, 0);
pollute(board, i, col-1);
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == 'P') {
board[i][j] = 'O';
} else if (board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
static void pollute(char[][] board, int row, int col) {
Queue<Integer> q = new LinkedList<Integer>();
q.offer(row*board[0].length + col);
while (!q.isEmpty()) {
int num = q.poll();
int m = num/board.length;
int n = num%board.length;
if (m < 0 || m >= board.length || n < 0 || n >= board[0].length || board[m][n] != 'O') {
continue;
}
board[m][n] = 'P';
q.offer((m - 1) * board[0].length + n);
q.offer((m + 1) * board[0].length + n);
q.offer((m) * board[0].length + n-1);
q.offer((m) * board[0].length + n+1);
}
}
DFS,过不了大OJ。
public class Solution {
publicvoid solve(char[][] board) {
if (board == null ||board.length == 0) {
return;
}
for (int i = 0; i <board.length; i++) {
dfs(board, i, 0);
dfs(board, i,board[0].length-1);
}
for (int j = 0; j <board[0].length; j++) {
dfs(board, 0, j);
dfs(board, board.length-1, j);
}
for (int i = 0; i <board.length; i++) {
for (int j = 0; j < board[0].length; j++){
if(board[i][j] == 'P') {
board[i][j] ='O';
} else{
board[i][j] ='X';
}
}
}
}
voiddfs(char[][] board, int row, int col) {
if (row < 0 || row >=board.length || col < 0 || col >= board[0].length || board[row][col]!= 'O') {
return;
}
board[row][col] ='P';
dfs(board, row-1,col);
dfs(board, row+1,col);
dfs(board, row,col-1);
dfs(board, row,col+1);
}
}