题目:Given an m x n matrix 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.
![]()
运用的知识点:dfs,标记位,二维vector可变长数组,auto使用,nbr二维数组表示四个方向的移动。
首先分部分编程,dfs和解决部分。
dfs:主要用途是设置visited,并且向四个方向寻找合理的结果。
解决部分。
从四个边界dfs修改visited。
此后剩下的O就是没有的了。全部翻成X。
思路关键是让与边界O连接的O变成访问过的,从而避免翻转。
class Solution {
public:
vector<vector<int>> nbrs = {{0,1},{1,0},{0,-1}, {-1,0}};
void dfs(vector<vector<char>>& graph, int i,int j, vector<vector<bool>>& visited )
{
visited[i][j] = true;
for(auto &nbr : nbrs )
{
int x = i + nbr[0];
int y = j + nbr[1];
if(x < 0 || y < 0 || x >= graph.size() || y >= graph[0].size() || visited[x][y]|| graph[x][y] == 'X')
continue;
dfs(graph, x, y, visited);
}
}
void solve(vector<vector<char>>& board) {
int m = board.size() , n = board[0].size();
vector<vector<bool>> visited(m, vector<bool>(n, false));
//do dfs from the boundary
//top and the bottom boundaries
for(int i = 0;i<n;i++){
if(!visited[0][i] && board[0][i] == 'O')
dfs(board, 0,i, visited );
if(!visited[m-1][i] && board[m-1][i] == 'O')
dfs(board, m-1,i, visited );
}
//for side boundary
for(int i = 0;i<m;i++)
{
if(!visited[i][0] && board[i][0] == 'O')
dfs(board, i,0, visited );
if(!visited[i][n-1] && board[i][n-1] == 'O')
dfs(board , i, n-1, visited);
}
//flip the relevent zero
for(int i =0;i<m;i++)
{
for(int j =0;j<n;j++)
{
if(board[i][j] == 'O' && !visited[i][j])
board[i][j] = 'X';
}
}
}
};


京公网安备 11010502036488号