LeetCode-130-被围绕的区域

1题目

给你一个 m x n 的矩阵 board ,由若干字符 'X''O' 组成,捕获 所有 被围绕的区域

  • 连接:一个单元格与水平或垂直方向上相邻的单元格连接。
  • 区域:连接所有 'O' 的单元格来形成一个区域。
  • 围绕:如果您可以用 'X' 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。

通过将输入矩阵 board 中的所有 'O' 替换为 'X'捕获被围绕的区域

示例 1:

输入: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"]]

解释:

img

在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。

示例 2:

输入:board = [["X"]]

输出:[["X"]]

提示:

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

题解

这一题处理方式这样的:

  • 先对设计边界的岛屿进行特殊处理,如标记为'#'
  • 然后我们再次遍历图,将未变成'#'的点变为'X',变成'#'的点变成'O'即可。
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) {
// 对涉及边界的岛屿进行特殊处理,然后在对处理后的岛屿进行处理
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
// 判断是否是边
boolean flag = i == 0 || j == 0 || i == board.length - 1 || j == board[0].length - 1;
// 只处理在边上的岛屿
if (flag && board[i][j] == 'O') {
dfs(board, i, j);
}
}
}

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] == '#') {
board[i][j] = 'O';
}
}
}
}

public void dfs(char[][] board, int r, int c) {
// 越界返回 r: row 行 c: column 列
if (r < 0 || r >= board.length || c < 0 || c >= board[0].length) {
return;
}
if (board[r][c] == 'X' || board[r][c] == '#') {
return;
}
board[r][c] = '#';
dfs(board, r + 1, c);
dfs(board, r - 1, c);
dfs(board, r, c + 1);
dfs(board, r, c - 1);
}
}

LeetCode-130-被围绕的区域
https://excelius.xyz/leetcode-130-被围绕的区域/
作者
Ther
发布于
2024年8月2日
许可协议