给定一个二维的矩阵,包含 ‘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’修改为‘T’,然后剩下的‘O’就是被包围的,将剩下的‘O’修改为‘X’,最后将‘T’修改回‘O’即可。
class Solution {
public:
int rowSize, colSize;
void solve(vector<vector<char>>& board) {
int rowSize = board.size();
if (rowSize == 0) {
return;
}
int colSize = board[0].size();
if (colSize == 0) {
return;
}
//将外围的所有'O'全部修改为'T'
for (int row = 0; row < rowSize; ++row) {
if (board[row][0] == 'O') {//左边界
board[row][0] = 'T';
dfs(board, row, 0, 'O', 'T');
}
if (board[row][colSize - 1] == 'O') {//右边界
board[row][colSize - 1] = 'T';
dfs(board, row, colSize - 1, 'O', 'T');
}
}
for (int col = 0; col < colSize; ++col) {
if (board[0][col] == 'O') {//上边界
board[0][col] = 'T';
dfs(board, 0, col, 'O', 'T');
}
if (board[rowSize - 1][col] == 'O') {//下边界
board[rowSize - 1][col] = 'T';
dfs(board, rowSize - 1, col, 'O', 'T');
}
}
//将中间剩余的'O'全部转换为'X'
for (int row = 1; row < rowSize - 1; ++row) {
for (int col = 1; col < colSize - 1; ++col) {
if (board[row][col] == 'O') {
board[row][col] = 'X';
}
}
}
//将外围的所有'T'全部修改为'O'
for (int row = 0; row < rowSize; ++row) {
if (board[row][0] == 'T') {//左边界
board[row][0] = 'O';
dfs(board, row, 0, 'T', 'O');
}
if (board[row][colSize - 1] == 'T') {//右边界
board[row][colSize - 1] = 'O';
dfs(board, row, colSize - 1, 'T', 'O');
}
}
for (int col = 0; col < colSize; ++col) {
if (board[0][col] == 'T') {//上边界
board[0][col] = 'O';
dfs(board, 0, col, 'T', 'O');
}
if (board[rowSize - 1][col] == 'T') {//下边界
board[rowSize - 1][col] = 'O';
dfs(board, rowSize - 1, col, 'T', 'O');
}
}
}
//将board[row][col]相邻且等于targetCh的修改为changeCh
void dfs(vector<vector<char>>& board, int row, int col, char targetCh, char changeCh) {
if (row - 1 >= 0 && board[row - 1][col] == targetCh) {//上方
board[row - 1][col] = changeCh;
dfs(board, row - 1, col, targetCh, changeCh);
}
if (row + 1 < board.size() && board[row + 1][col] == targetCh) {//下方
board[row + 1][col] = changeCh;
dfs(board, row + 1, col, targetCh, changeCh);
}
if (col - 1 >= 0 && board[row][col - 1] == targetCh) {//左方
board[row][col - 1] = changeCh;
dfs(board, row, col - 1, targetCh, changeCh);
}
if (col + 1 < board[0].size() && board[row][col + 1] == targetCh) {//右方
board[row][col + 1] = changeCh;
dfs(board, row, col + 1, targetCh, changeCh);
}
}
};