解题思路:关键点是发现所有不被包围的点都与边界上的“O”点相连。
给一个二维的矩阵,包含 'X'
和 'O'
, 找到所有被 'X' 围绕的区域,并用 'X' 填充满。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出二维矩阵:
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
X O X X
标签
class Solution {
public:
/*
* @param board: board a 2D board containing 'X' and 'O'
* @return: nothing
*/
void surroundedRegions(vector<vector<char>> &board) {
// write your code here
if(board.empty())
return;
int row=board.size(),col=board[0].size();
//cout<<row<<col<<endl;
//第一行
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if((i==0||i==row-1||j==0||j==col-1)&&board[i][j]=='O'){
board[i][j]='f';
stack<int> row1,col1;
row1.push(i);
col1.push(j);
while(!row1.empty()){
int tempR=row1.top(),tempC=col1.top();
col1.pop();
row1.pop();
if(tempR-1>=0&&board[tempR-1][tempC]=='O'){
board[tempR-1][tempC]='f';
row1.push(tempR-1);
col1.push(tempC);
}
if(tempR+1<row&&board[tempR+1][tempC]=='O'){
board[tempR+1][tempC]='f';
row1.push(tempR+1);
col1.push(tempC);
}
if(tempC-1>-1&&board[tempR][tempC-1]=='O'){
board[tempR][tempC-1]='f';
row1.push(tempR);
col1.push(tempC-1);
}
if(tempC+1<col&&board[tempR][tempC+1]=='O'){
board[tempR][tempC+1]='f';
row1.push(tempR);
col1.push(tempC+1);
}
}
}
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]=='O')
board[i][j]='X';
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]=='f')
board[i][j]='O';
}
}
}
};