这段时间重温一下C++编程
130. 被围绕的区域
新瓶装老酒 和之前的岛屿问题类似,DFS BFS都可以做,先扫边缘一圈
DFS
class Solution {
public:
int n,m;
int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(vector<vector<char>>& board,int i,int j){
board[i][j] ='Y';
for(int k=0;k<4;k++){
int x = i +dis[k][0],y=j+dis[k][1];
if (x > 0 && x < n && y > 0 && y <m && board[x][y] == 'O') {
dfs(board,x,y);
}
}
}
void solve(vector<vector<char>>& board) {
n = board.size(),m=board[0].size();
for (int i =0;i<n;i++){
if (board[i][0]=='O')
dfs(board,i,0);
if (board[i][m-1]=='O')
dfs(board,i,m-1);
}
for (int j =0;j<m;j++){
if (board[0][j]=='O')
dfs(board,0,j);
if (board[n-1][j]=='O')
dfs(board,n-1,j);
}
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
if (board[i][j]=='O')
board[i][j] ='X';
if(board[i][j]=='Y')
board[i][j] ='O';
}
}
}
};
BFS
class Solution {
public:
int n,m;
int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void solve(vector<vector<char>>& board) {
n = board.size(),m=board[0].size();
queue<pair<int, int>> que;
for (int i =0;i<n;i++){
if (board[i][0]=='O')
que.emplace(i, 0);
if (board[i][m-1]=='O')
que.emplace(i, m-1);
}
for (int j =0;j<m;j++){
if (board[0][j]=='O')
que.emplace(0, j);
if (board[n-1][j]=='O')
que.emplace(n-1, j);
}
while(! que.empty()){
int i = que.front().first, j = que.front().second;
board[i][j]='Y';
que.pop();
for(int k=0;k<4;k++){
int x = i +dis[k][0],y=j+dis[k][1];
if (x > 0 && x < n && y > 0 && y <m && board[x][y] == 'O')
que.emplace(x,y);
}
}
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
if (board[i][j]=='O')
board[i][j] ='X';
if(board[i][j]=='Y')
board[i][j] ='O';
}
}
}
};