0
点赞
收藏
分享

微信扫一扫

力扣130-被围绕的区域-C++

一、运行结果

 

二、题目

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 '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"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:

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

三、思路

题目要求的是将不与边界相连的O 区域全部改为X,我们可以换一个思路,现将所有与边界相连的O换为另一个字符,比如A,则处理完与边界相连的O之后,剩下的O就是被围绕的,都将其改为X。

所以这里首先处理四个边界,如果边界某个字符为O,则进行深度递归,处理其上下左右的O,全部改为A,处理完成后,遍历整个字符数组,如果当前字符是O,就改为X;如果是A,就改回O。

四、代码

class Solution {
public:
void solve(vector<vector<char>>& board) {
int len1 = board.size();
int len2 = board[0].size();
for(int i=0; i<len1; i++){ //处理左右边界相连的O 全改为A
if(board[i][0] == 'O') dfs(board, len1, len2, i, 0);
if(board[i][len2-1] == 'O') dfs(board, len1, len2, i, len2-1);
}
for(int j=1; j<len2-1; j++){ //处理与上下边界相连的O 全改为A
if(board[0][j] == 'O') dfs(board, len1, len2, 0, j);
if(board[len1-1][j] == 'O') dfs(board, len1, len2, len1-1, j);
}
for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){
if(board[i][j] == 'O') board[i][j] = 'X';
else if(board[i][j] == 'A') board[i][j] = 'O'; //将A改回O
}
}
}
// 将与之相连的所有O 都改为 A
void dfs(vector<vector<char>>& board, int len1, int len2, int i, int j){
if(i<0 || i>=len1 || j<0 || j>= len2 || board[i][j] != 'O'){
return; //越界或该字符不是O 退出
}
if(board[i][j] == 'O') board[i][j] = 'A';
dfs(board, len1, len2, i-1, j); //查看左右上下
dfs(board, len1, len2, i+1, j);
dfs(board, len1, len2, i, j-1);
dfs(board, len1, len2, i, j+1);
}
};
举报

相关推荐

0 条评论