Given a 2D board containing 'X'
and '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都是无法被包围的,所以只要从边上开始找就行了
深度优先算法:
class Solution {
public:
void solve(vector<vector<char>>& board) {
vector<pair<int,int>> vec;
int m=board.size();
if (m!=0) {
int n=board[0].size();
for (int j=0;j<n;j++){
find_zero(0,j,vec,board);
find_zero(m-1,j,vec,board);
}
for (int i=0;i<m;i++) {
find_zero(i,0,vec,board);
find_zero(i,n-1,vec,board);
}
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
board[i][j]='X';
for (int i=0;i<vec.size();i++){
int x=vec[i].first;
int y=vec[i].second;
board[x][y]='O';
}
}
}
void find_zero(int i,int j, vector<pair<int,int>>& vec, vector<vector<char>>& board ) {
int dx[4]={-1,0,0,1};
int dy[4]={0,1,-1,0};
if (board[i][j]=='O'){
vec.push_back(make_pair(i,j));
//cout<<i<<","<<j<<endl;
board[i][j]='X';
for (int k=0;k<4;k++)
if (0<= i+dx[k] && i+dx[k] <board.size() && 0<= j+dy[k] && j+dy[k] <board[0].size())
find_zero(i+dx[k],j+dy[k],vec,board);
}
}
};
然而大规模数据runtime error, 碰到了传说中的爆栈问题,改用宽度优先来尝试
宽度优先算法:
class Solution {
public:
void solve(vector<vector<char>>& board) {
vector<pair<int,int>> vec;
int m=board.size();
if (m!=0) {
int n=board[0].size();
for (int j=0;j<n;j++){
if(board[0][j]=='O')
find_zero(0,j,vec,board);
if(board[m-1][j]=='O')
find_zero(m-1,j,vec,board);
}
for (int i=0;i<m;i++) {
if(board[i][0]=='O')
find_zero(i,0,vec,board);
if(board[i][n-1]=='O')
find_zero(i,n-1,vec,board);
}
for (int i=1;i<=m-2;i++)
for (int j=1;j<=n-2;j++)
board[i][j]='X';
for (int i=0;i<vec.size();i++){
int x=vec[i].first;
int y=vec[i].second;
board[x][y]='O';
}
}
}
void find_zero(int i,int j, vector<pair<int,int>>& vec, vector<vector<char>>& board ) {
int dx[4]={-1,0,0,1};
int dy[4]={0,1,-1,0};
queue<pair<int,int>> que;
que.push(make_pair(i,j));
while (!que.empty()) {
int i_1=que.front().first;
int j_1=que.front().second;
que.pop();
if (board[i_1][j_1]=='O'){
vec.push_back(make_pair(i_1,j_1));
//cout<<i<<","<<j<<endl;
board[i_1][j_1]='X';
for (int k=0;k<4;k++)
if (0<= i_1+dx[k] && i_1+dx[k] <board.size() && 0<= j_1+dy[k] && j_1+dy[k] <board[0].size())
if (board[ i_1+dx[k] ][ j_1+dy[k] ]=='O')
que.push(make_pair(i_1+dx[k], j_1+dy[k]));
}
}
}
};
果然通过了~~~