被围绕的区域

130. 被围绕的区域 - 力扣(LeetCode)

给你一个 m x n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例 1:

img

1
2
3
输入:board = [["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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

1
2
输入:board = [["X"]]
输出:[["X"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j]'X''O'

步骤一:深搜或者广搜将地图周边的’O’全部改成’A’,如图所示:

image-20231006120720293

步骤二:在遍历地图,将’O’全部改成’X’(地图中间的’O’改成了’X’),将’A’改回’O’(保留的地图周边的’O’),如图所示:

image-20231006120744546
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public void solve(char[][] board) {
//遍历上下边界的区域,并置为A
for(int i = 0; i < board[0].length; i++){
if(board[0][i] == 'O') dfs(board, 0, i);
if(board[board.length-1][i] == 'O') dfs(board, board.length-1, i);
}
//遍历左右边界的区域,并置为A
for(int i = 0; i <board.length; i++){
if(board[i][0] == 'O') dfs(board, i, 0);
if(board[i][board[0].length-1] == 'O') dfs(board, i, board[0].length-1);
}

//将中间的区域O置为X,区域A置为O
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
if(board[i][j] == 'O') board[i][j] = 'X';
if(board[i][j] == 'A') board[i][j] = 'O';
}
}
return;
}

public void dfs(char[][] grid, int x, int y){
//越界或者该节点已被访问,或遇到到了非岛屿,直接return
if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length){
return;
}
if(grid[x][y] == 'X' || grid[x][y] == 'A'){
return;
}
//访问该节点
grid[x][y] = 'A';
dfs(grid, x - 1, y); //向上
dfs(grid, x , y - 1); //向左
dfs(grid, x + 1, y); //向下
dfs(grid, x , y + 1); //向右

}

}

被围绕的区域
http://example.com/2023/09/18/算法/图/5. 被围绕的区域/
作者
PALE13
发布于
2023年9月18日
许可协议