题目:
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
AC代码:广度优先搜索
class Solution {
public void solve(char[][] board) {
int row = board.length;
if(row == 0)
return ;
int col = board[0].length;
int[] x_move = new int[]{0,1,-1,0};
int[] y_move = new int[]{1,0,0,-1};
Queue<Integer> queue = new LinkedList<Integer>();
Queue<Integer> waitedAlter = new LinkedList<Integer>();
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
//第一行
for(int i=0;i!=col;++i){
if(board[0][i] == 'O'){
queue.add(i);
map.put(i,1);
}
}
//第一列
for(int i=0;i!=row;++i){
if(board[i][0] == 'O'){
int index = i * col;
queue.add(index);
map.put(index,1);
}
}
int tmp = col - 1;
//最后一列
for(int i=0;i!=row;++i){
if(board[i][tmp] == 'O'){
int index = i * col + tmp;
queue.add(index);
map.put(index,1);
}
}
//最后一行
tmp = row - 1;
for(int i=0;i!=col;++i){
if(board[tmp][i] == 'O'){
int index = tmp * col + i;
queue.add(index);
map.put(index,1);
}
}
while(!queue.isEmpty()){
int deSerialize = queue.remove();
int deSerialize_X = deSerialize / col;
int deSerialize_Y = deSerialize % col;
for(int i=0;i!=4;++i){
int added_X = deSerialize_X + x_move[i];
int added_y = deSerialize_Y + y_move[i];
if(added_X >= 0 && added_X < row && added_y >= 0 && added_y < col){
if(board[added_X][added_y] == 'O'){
int index = added_X * col + added_y;
if(!map.containsKey(index)){
map.put(index,1);
queue.add(index);
}
}
}
}
}
for(int i=0;i!=row;++i){
for(int j=0;j!=col;++j){
int index = i * col + j;
if(board[i][j] == 'O' && !map.containsKey(index)){
board[i][j] = 'X';
}
}
}
}
}