力扣 leetcode 130. 被围绕的区域
问题描述
给你一个 m * n
的矩阵 board
,由若干字符 'X'
和 'O'
,找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
提示:
- m == board.length
- n == board[i].length
- 1 <= m, n <= 200
- board[i][j] 为 'X' 或 'O'
示例
示例 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"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [["X"]]
输出:[["X"]]
解题思路
本题考查的还是图的遍历,我们使用 BFS 来解决。首先,需要找出边界上的 'O' 点,然后再根据这些点来找出与之相连的其它 'O' 点。
将边界上的'O' 点以及与之相邻的 'O' 点标记,在之后的染色过程中不对这些点进行染色。
最后,将所有未标记的 'O' 点染色。
class Solution {
public:
void solve(vector<vector<char>>& board) {
const int m = board.size();
const int n = board[0].size();
if(m < 3 || n < 3){
return;
}
vector<vector<bool>> dye(m, vector<bool> (n, true));
queue<pair<int, int>> q;
int x = 0;
int y = 0;
// 找出第一行中的 O 点
for(int i = 0; i < n; i++){
if(board[0][i] == 'O'){
dye[0][i] = false;
q.emplace(0, i);
}
}
// 找出最后一行中的 O 点
for(int i = 0; i < n; i++){
if(board[m - 1][i] == 'O'){
dye[m - 1][i] = false;
q.emplace(m - 1, i);
}
}
// 找出第一列中的 O 点
for(int i = 1; i < m; i++){
if(board[i][0] == 'O'){
dye[i][0] = false;
q.emplace(i, 0);
}
}
// 找出最后一列中的 O 点
for(int i = 1; i < m; i++){
if(board[i][n - 1] == 'O'){
dye[i][n - 1] = false;
q.emplace(i, n - 1);
}
}
// 遍历之前找出的 O 点
while(!q.empty()){
x = q.front().first;
y = q.front().second;
q.pop();
if(x > 0 && board[x - 1][y] == 'O' && dye[x - 1][y]){
dye[x - 1][y] = false;
q.emplace(x - 1, y);
}
if(x < m - 1 && board[x + 1][y] == 'O' && dye[x + 1][y]){
dye[x + 1][y] = false;
q.emplace(x + 1, y);
}
if(y > 0 && board[x][y - 1] == 'O' && dye[x][y - 1]){
dye[x][y - 1] = false;
q.emplace(x, y - 1);
}
if(y < n - 1 && board[x][y + 1] == 'O' && dye[x][y + 1]){
dye[x][y + 1] = false;
q.emplace(x, y + 1);
}
}
// 染色
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(board[i][j] == 'O' && dye[i][j]){
board[i][j] = 'X';
}
}
}
}
};
本文来自博客园,作者:greatestchen},转载请注明原文链接:https://www.cnblogs.com/greatestchen/p/16961691.html