给定一个二维的矩阵,包含 '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’有联系的区域都不会填充,其他都会被填充
第一步:
将所有边界上的‘O’转化为‘1’(1.区别两种‘O’ 2.避免重复遍历)
对每个元素调用check()函数
check函数的实现:
判断元素是否为‘O’,如果是,将其转化为‘1’,并且遍历它的上下左右
第二步:
将所有‘O’元素(未被转化为‘1’的)转化为‘X’
第三步:
将所有‘1’元素转化为‘O’
代码:
class Solution {
public:
void solve(vector<vector<char>>& board) {
if(board.empty()||board.size() == 0 || board[0].size() == 0)
return;
int row=board.size(),column=board[0].size();
for (int i = 0; i < row; ++i) {
check(board, i, 0); // first column
check(board, i, column - 1); // last column
}
for (int j = 1; j < column - 1; ++j) {
check(board, 0, j); // first row
check(board, row - 1, j); // last row
}
for (int i = 0; i < row; ++i)
for (int j = 0; j < column; ++j)
if (board[i][j] == 'O') board[i][j] = 'X';
else if (board[i][j] == '1') board[i][j] = 'O';
}
void check(vector<vector<char>>& board,int x,int y)
{
if(board[x][y]=='O'){
board[x][y]='1';
if(x>1) check(board,x-1,y);
if(y>1) check(board,x,y-1);
if(x<board.size()-1) check(board,x+1,y);
if(y<board[0].size()-1) check(board,x,y+1);
}
}
};