Keshawn_lu's Blog

Leetcode 130. 被围绕的区域

字数统计: 550阅读时长: 2 min
2020/08/11 Share

题目简介:

给定一个二维的矩阵,包含 'X''O'字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

示例:

1
2
3
4
X X X X
X O O X
X X O X
X O X X

运行你的函数后,矩阵变为:

1
2
3
4
X X X X
X X X X
X X X X
X O X X

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路:

由于最后不会变成XO(即没有被围绕),必定是直接或间接与边界上的O相连的,所以利用广度优先遍历,先将边界上的O入队,再去寻找直接或间接与其相连的点,并都设为S(做标记),最后再遍历一次矩阵,将S的点都设为O,其余的都为X即可。

tips

  • 学会使用emplace()函数。

代码如下:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class Solution {
public:
void solve(vector<vector<char>>& board) {

if(board.size() == 0)
return;

queue<pair<int, int>> qu;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int n = board.size();
int m = board[0].size();

//将边界的'O'入队
for(int i = 0; i < n; i++){

if(board[i][0] == 'O')
qu.emplace(i, 0);

if(board[i][m - 1] == 'O')
qu.emplace(i, m - 1);
}

for(int j = 1; j < m - 1; j++){

if(board[0][j] == 'O')
qu.emplace(0, j);

if(board[n - 1][j] == 'O')
qu.emplace(n - 1, j);
}

//寻找与边界'O'相邻的'O'
while(!qu.empty()){

auto temp = qu.front();
qu.pop();

int now_x = temp.first;
int now_y = temp.second;

board[now_x][now_y] = 'S';

for(int i = 0; i < 4; i++){

int x = now_x + dx[i];
int y = now_y + dy[i];

if(x >= 0 && x < n && y >= 0 && y < m){

if(board[x][y] == 'O')
qu.emplace(x, y);
}
}
}

for(int i = 0; i < n; i++){

for(int j = 0; j < m; j++){

if(board[i][j] == 'S')
board[i][j] = 'O';
else
board[i][j] = 'X';
}
}

}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: