Given a 2D board containing 'X'
and 'O'
(the letter O), capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
这道题我刚看完后就有了一个思路,就是要区别出闭区域的O和开区域的O,显然本题求开区域的O要简单的多,因为首先你可以将整个矩阵的外围遍历一遍,然后获得外围的O这些一定是开区域的,之后,再从这些点出发,广度搜索与这些相邻的O点,这些点仍然是开区域的。这样本题的思路就明晰了。
X X X X X X X X X X X X
X X O X -> X X O X -> X X X X
X O X X X Y X X X O X X
X O X X X Y X X X O X X
按照这个思路写了代码,结果很好,编译错误解决后居然一次AC了。看了看discuss,思路果然和我一样~
代码在找外围的O时,用了两套循环,这里是可以改进的,很简单,我就不做修改了,贴上原先的代码:
class Solution {
public:
void solve(vector<vector<char>>& board) {
int m = board.size();
if(m == 0)return;
int n = board[0].size();
if(n == 0)return;
for(int i(0);i<m;i++)
for(int j(0);j<n;j++)
{
if((i ==0||i==m-1)&&board[i][j]=='O'){
board[i][j]='Y';
help(board,i,j);
}
else if((j ==0||j == n-1)&&board[i][j]=='O'){
board[i][j]='Y';
help(board,i,j);
}
}
for(int i(0);i<m;i++)
for(int j(0);j<n;j++)
{
if(board[i][j] == 'O')board[i][j] = 'X';
if(board[i][j] == 'Y')board[i][j] = 'O';
}
}
void help(vector<vector<char>>& board,int i,int j){
if(i-1>0&&board[i-1][j]=='O'){
board[i-1][j]='Y';
help(board,i-1,j);
}
if(i+1<board.size()&&board[i+1][j]=='O'){
board[i+1][j]='Y';
help(board,i+1,j);
}
if(j-1>0&&board[i][j-1]=='O'){
board[i][j-1]='Y';
help(board,i,j-1);
}
if(i+1<board[0].size()&&board[i][j+1]=='O'){
board[i][j+1]='Y';
help(board,i,j+1);
}
}
};