问题描述
现在有一个仅包含‘X’和‘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点,找到O后向周围继续寻找与之相连的点,并标注为*。标注为的理由有两个,1是搜索已访问标示,2是的点表示这些点没有被全包围,而剩下的O都是被全包围的。
因此在标注出后只需将所有的O变为X,再将变为O。
class Solution {
public:
void deepSearch(int row,int col,vector<vector<char>> &b){
if(col<0||row<0||row>=b.size()||col>=b[0].size())return;
if(b[row][col]=='O'){
b[row][col]='*';
deepSearch(row-1,col,b);
deepSearch(row+1,col,b);
deepSearch(row,col-1,b);
deepSearch(row,col+1,b);
}
}
void solve(vector<vector<char>> &board) {
int rows=board.size();if(rows<=0)return;
int cols=board[0].size();
for(int i=0;i<cols;i++){
deepSearch(0,i,board);
deepSearch(rows-1,i,board);
}
for(int i=0;i<rows;i++){
deepSearch(i,0,board);
deepSearch(i,cols-1,board);
}
for(int i= 0;i<rows;i++){
for(int j=0;j<cols;j++){
if(board[i][j]=='*')board[i][j]='O';
else board[i][j]='X';
}
}
}
};