- 无脑深搜两次,一次判断是否位于内部,一次变‘X’
class Solution {
public:
bool is_inside(int x, int y){
if (x > 0 && x < len_x - 1 && y > 0 && y < len_y - 1)
return true;
return false;
}
bool is_legal(int x,int y){
if (x >= 0 && x < len_x && y >= 0 && y < len_y)
return true;
return false;
}
void print(vector<vector<char>>& board){
for(auto b: board){
for(auto a: b){
cout << a << " ";
}
cout << endl;
}
cout << endl;
}
bool dfs(vector<vector<char>>& board, vector<vector<bool>> &record, int x, int y,bool is_add_X){
record[x][y] = true;
bool flag = true;
for(int i=0;i<4;++i){
int target_x = x + dir[i][0];
int target_y = y + dir[i][1];
if(!is_add_X){
if(is_legal(target_x, target_y) && board[target_x][target_y] == 'O' && !record[target_x][target_y]){
if(!is_inside(target_x,target_y))
flag = false;
flag = dfs(board, record, target_x, target_y, false) && flag;
}
}
else{
if(board[target_x][target_y] == 'O'){
board[target_x][target_y] = 'X';
dfs(board, record, target_x, target_y, true);
}
}
}
return flag;
}
void solve(vector<vector<char>>& board) {
len_x = board.size();
len_y = board[0].size();
vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
for(int i=1;i<len_x-1;++i)
for(int j=1;j<len_y-1;++j){
if(board[i][j] == 'O' && record[i][j] == false && dfs(board, record, i, j, false)){
board[i][j] = 'X';
dfs(board, record, i, j, true);
}
}
}
private:
int len_x;
int len_y;
int dir[4][2] = {
{0,1},
{0,-1},
{-1,0},
{1,0}
};
};
- 优化版,先深搜边界将O改为T,再修改所有剩下的O
class Solution {
public:
bool is_inside(int x, int y){
if (x > 0 && x < len_x - 1 && y > 0 && y < len_y - 1)
return true;
return false;
}
bool is_legal(int x,int y){
if (x >= 0 && x < len_x && y >= 0 && y < len_y)
return true;
return false;
}
void print(vector<vector<char>>& board){
for(auto b: board){
for(auto a: b){
cout << a << " ";
}
cout << endl;
}
cout << endl;
}
void dfs(vector<vector<char>>& board, vector<vector<bool>> &record, int x, int y){
record[x][y] = true;
board[x][y] = 'T';
for(int i=0;i<4;++i){
int target_x = x + dir[i][0];
int target_y = y + dir[i][1];
if(is_legal(target_x, target_y) && board[target_x][target_y] == 'O'
&& !record[target_x][target_y])
dfs(board, record, target_x, target_y);
}
}
void solve(vector<vector<char>>& board) {
len_x = board.size();
len_y = board[0].size();
vector<vector<bool>> record(len_x, vector<bool>(len_y, false));
for(int i=0;i<len_x;++i){
if(board[i][0] == 'O')
dfs(board, record, i, 0);
if(board[i][len_y-1] == 'O')
dfs(board, record, i, len_y-1);
}
for(int j=1;j<len_y-1;++j){
if(board[0][j] == 'O')
dfs(board, record, 0, j);
if(board[len_x-1][j] == 'O')
dfs(board, record, len_x-1, j);
}
for(int i=0;i<len_x;++i)
for(int j=0;j<len_y;++j)
if(board[i][j] == 'T')
board[i][j] = 'O';
else if(board[i][j] == 'O')
board[i][j] = 'X';
}
private:
int len_x;
int len_y;
int dir[4][2] = {
{0,1},
{0,-1},
{-1,0},
{1,0}
};
};