LeetCode 130. 被围绕的区域(Surrounded Regions)
题目描述
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
解题思路
分为两步:
- 首先对矩阵四条边界上的所有
'O'进行深度优先搜索,并将所有与边界相连区域的'O'填充为'#'
然后遍历整个矩阵,将当前所有'O',即处在被
'X'
围绕的区域的'O'填充为
,并将上一步填充的所有'#'还原为'O''X'
代码
1 class Solution { 2 public: 3 void solve(vector<vector<char>>& board) { 4 if(board.empty() || board[0].empty()) return; 5 int rows = board.size(), cols = board[0].size(); 6 for(int i = 0; i < cols; i++){ 7 if(board[0][i] == 'O') fillBorder(board, 0, i); 8 if(board[rows - 1][i] == 'O') fillBorder(board, rows - 1, i); 9 } 10 for(int i = 0; i < rows; i++){ 11 if(board[i][0] == 'O') fillBorder(board, i, 0); 12 if(board[i][cols - 1] == 'O') fillBorder(board, i, cols - 1); 13 } 14 for(int i = 0; i < rows; i++){ 15 for(int j = 0; j < cols; j++){ 16 if(board[i][j] == 'O') board[i][j] = 'X'; 17 if(board[i][j] == '#') board[i][j] = 'O'; 18 } 19 } 20 } 21 void fillBorder(vector<vector<char>>& board, int row, int col){ 22 board[row][col] = '#'; 23 if(row - 1 >= 0 && board[row - 1][col] == 'O') fillBorder(board, row - 1, col); 24 if(row + 1 < board.size() && board[row + 1][col] == 'O') fillBorder(board, row + 1, col); 25 if(col - 1 >= 0 && board[row][col - 1] == 'O') fillBorder(board, row, col - 1); 26 if(col + 1 < board[0].size() && board[row][col + 1] == 'O') fillBorder(board, row, col + 1); 27 } 28 };