Surrounded Regions
Given a 2D board containing 'X'
and '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
LeetCode:https://oj.leetcode.com/problems/surrounded-regions/
题解:本题可以采用从四周向内部扩展的方式保留所有开放的‘O’;扩展的方式为:当遇到‘X’,则停止;当遇到‘O’,则将‘O’改成‘#’,当扩展停止时,遍历整个board,将‘#’改成‘O’,将‘O’改成‘X’;扩展的思路可以采用BFS。
代码如下:
public class Solution {
class Pair{
int i;
int j;
public Pair(int ii, int jj){
this.i = ii;
this.j = jj;
}
}
public void solve(char[][] board) {
if(board == null || board.length == 0)
return;
Queue<Pair> queue = new LinkedList<Pair>();
int row = board.length;
int column = board[0].length;
for(int i = 0; i < row; i++){
if(board[i][0] == 'O'){
queue.add(new Pair(i, 0));
bfs(queue, board);
}
if(board[i][column-1] == 'O'){
queue.add(new Pair(i, column-1));
bfs(queue, board);
}
}
for(int j = 0; j < column; j++){
if(board[0][j] == 'O'){
queue.add(new Pair(0, j));
bfs(queue, board);
}
if(board[row-1][j] == 'O'){
queue.add(new Pair(row-1, j));
bfs(queue, board);
}
}
for(int i = 0; i < row; i++){
for(int j = 0; j < column; j++){
if(board[i][j] == '#')
board[i][j] = 'O';
else if(board[i][j] == 'O')
board[i][j] = 'X';
}
}
}
private void bfs(Queue<Pair> queue, char[][] board){
int row = board.length;
int column = board[0].length;
while(!queue.isEmpty()){
Pair elem = queue.poll();
int i = elem.i;
int j = elem.j;
if(elem.i < 0 || elem.j < 0 || elem.i >= row || elem.j >= column || board[i][j] != 'O')
continue;
board[i][j] = '#';
queue.add(new Pair(elem.i-1, elem.j));
queue.add(new Pair(elem.i+1, elem.j));
queue.add(new Pair(elem.i, elem.j-1));
queue.add(new Pair(elem.i, elem.j+1));
}
}
}