深度优先遍历 DFS ;
分析:只要与边界接触且值为'o'的相邻的'o'区域都为不可变,其他的都为可变,所以只需要遍历四个边界即可
需要辅助数组 vector<vector<int>> sample(m,vector<int>(n,1)) ; 值为0时标记为不可变
1. 遍历四个边界遇到‘O’将其标记为不可变,并且向四周延申,将与'O'相邻且未标记为不可变(0)的元素皆标记为不可变(0)
class Solution {
public:
/*只需要判断,相邻的所有区域是否与边界相连即可
如果与当前块相邻的最外侧元素为0则不需要转换,否则需要转换
*/
void solve(vector<vector<char>>& board) {
if(board.empty()){
return;
}
int m = board.size();
int n = board[0].size();
vector<vector<int>> sample(m,vector<int>(n,1));
int x = 0;
int y = 0;
while(true){
if(board[x][y] == 'O'){
if(sample[x][y] == 1) check(board,sample,x,y,m,n);
}
// 向右走
if(x == 0&&y!=(n-1)){
y++;
continue;
}else if(y == n-1&&x!=(m-1)){ // 向下走
x++;
}else if(x ==m-1&&y!=0){ // 向左走
y--;
}else if(y==0&&x!=0){ //向上走
x--;
}
if(x==0&&y==0){
break;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j] =='O' &&sample[i][j] == 1){
board[i][j] = 'X';
}
}
}
}
/*将所有与边界上为'O'相邻的区域标记为不更改*/
void check(vector<vector<char>>& board,vector<vector<int>>& sample,int x,int y,int m,int n){
// 将当前点设置为不可变
sample[x][y] = 0;
queue<pair<int,int>> q;
q.push(make_pair(x,y));
// 判断四个方向都没有为 ‘o’的值位置,或者当前值为‘o’且sample=0;
while(!q.empty()){
pair<int,int> p = q.front();
q.pop();
x = p.first;
y = p.second;
// cout<<x<<y<<endl;
if((x-1)>=0&&board[x-1][y] == 'O' && sample[x-1][y] == 1){
// 将左侧的入列
q.push(make_pair(x-1,y));
sample[x-1][y] = 0; // 将当前点标记为不可变
}
if((y-1)>=0&&board[x][y-1] == 'O' &&sample[x][y-1] == 1){
q.push(make_pair(x,y-1));
sample[x][y-1] = 0; // 将当前点标记为不可变
}
if((x+1)<m&&board[x+1][y] == 'O' &&sample[x+1][y] == 1){
q.push(make_pair(x+1,y));
sample[x+1][y] = 0; // 将当前点标记为不可变
}
if((y+1)<n&&board[x][y+1] == 'O' &&sample[x][y+1]== 1){
q.push(make_pair(x,y+1));
sample[x][y+1] = 0; // 将当前点标记为不可变
}
}
}
};