给定一个二维的矩阵,包含 '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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
class Solution {
boolean[][] visited;
// 创建一个节点,存储x, y
public class Pos{
int i;
int j;
Pos(int i, int j) {
this.i = i;
this.j = j;
}
}
public void solve(char[][] board) {
if(board.length == 0)
return;
int rows = board.length, cols = board[0].length;
visited = new boolean[rows][cols];
// 左侧一列
for(int i = 0; i < rows; i++) {
if(board[i][0] == 'O' && visited[i][0] != true) {
bfs(board, i, 0);
}
}
// 上侧一列
for(int i = 0; i < cols; i++) {
if(board[0][i] == 'O' && visited[0][i] != true) {
bfs(board, 0, i);
}
}
// 右侧一列
for(int i = 0; i < rows; i++) {
if(board[i][cols - 1] == 'O' && visited[i][cols - 1] != true) {
bfs(board, i, cols - 1);
}
}
// 下侧一列
for(int i = 0; i < cols; i++) {
if(board[rows - 1][i] == 'O' && visited[rows - 1][i] != true) {
bfs(board, rows - 1, i);
}
}
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(!visited[i][j]) {
board[i][j] = 'X';
}
}
}
}
public void bfs(char[][] board, int i, int j) {
Queue<Pos> queue = new LinkedList<>();
queue.add(new Pos(i, j));
visited[i][j] = true;
while(!queue.isEmpty()) {
Pos current = queue.poll();
// 上
if (current.i - 1 >= 0
&& board[current.i - 1][current.j] == 'O'
&& !visited[current.i - 1][current.j]) {
queue.add(new Pos(current.i - 1, current.j));
visited[current.i - 1][current.j] = true;
// 没有continue.
}
// 下
if (current.i + 1 <= board.length - 1
&& board[current.i + 1][current.j] == 'O'
&& !visited[current.i + 1][current.j]) {
queue.add(new Pos(current.i + 1, current.j));
visited[current.i + 1][current.j] = true;
}
// 左
if (current.j - 1 >= 0
&& board[current.i][current.j - 1] == 'O'
&& !visited[current.i][current.j - 1]) {
queue.add(new Pos(current.i, current.j - 1));
visited[current.i][current.j - 1] = true;
}
// 右
if (current.j + 1 <= board[0].length - 1
&& board[current.i][current.j + 1] == 'O'
&& !visited[current.i][current.j + 1]) {
queue.add(new Pos(current.i, current.j + 1));
visited[current.i][current.j + 1] = true;
}
}
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。