思路:刚开始觉得如果每个'O'点如果四个方向上存在'X'点,则其被包围,其实如果存在一条路径,即所有'O'点相连,最后连接到边界上去了,那么这个点就没有被包围,所以,只能通过边界的'O'点来进行深度搜索,只要与边界'O'相连通的'O'点都是没有被覆盖的,剩下的就好办了。
code:
class Solution {
public:
bool isRightLoc(int i,int j,int rows,int cols){
if(i <rows && i >=0 && j < cols && j >=0)
return true;
return false;
}
void solve(vector<vector<char>> &board) {
if(board.size() == 0)return;
int rows = board.size(), cols = board[0].size();
for(int j = 0;j < cols;j++){
if(board[0][j] == 'O'){
//board[0][j] = 'T';
//cout<<"sdf"<<endl;
dfs(0,j,board);
}
if(board[rows-1][j] == 'O'){
//board[rows-1][j] = 'T';
dfs(rows-1,j,board);
}
}
for(int i = 1;i < rows-1;i++){
if(board[i][0] == 'O'){
//board[i][0] = 'T';
dfs(i,0,board);
}
if(board[i][cols-1] == 'O'){
//board[i][cols-1] = 'T';
dfs(i,cols-1,board);
}
}
for(int i = 0;i < rows;i++)
for(int j = 0;j < cols;j++){
if(board[i][j] == 'O')
board[i][j] = 'X';
else if(board[i][j] == 'T')
board[i][j] = 'O';
}
}
void dfs(int i,int j,vector<vector<char>> &board){
int rows = board.size(), cols = board[0].size();
if(isRightLoc(i,j,rows,cols)){
//cout<<i<<" "<<j<<" "<<board[i][j]<<endl;
if(board[i][j] == 'O'){
board[i][j] = 'T';
dfs(i,j+1,board);
dfs(i-1,j,board);
dfs(i,j-1,board);
dfs(i+1,j,board);
}
}
}
};