题目:
- 给你一个
m x n
的矩阵board
,由若干字符'X'
和'O'
,找到所有被'X'
围绕的区域,并将这些区域里所有的'O'
用'X'
填充。
示例:
- 输入: b o a r d = [ [ " X " , " X " , " X " , " X " ] , [ " X " , " O " , " O " , " X " ] , [ " X " , " X " , " O " , " X " ] , [ " X " , " O " , " X " , " X " ] ] board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] board=[["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
- 输出: [ [ " X " , " X " , " X " , " X " ] , [ " X " , " X " , " X " , " X " ] , [ " X " , " X " , " X " , " X " ] , [ " X " , " O " , " X " , " X " ] ] [["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] [["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解题思路:(BFS)
利用一个二维bool
数组visited
记录当前元素是否被访问过,首先遍历四周,当四周有元素出现'O'
时,利用BFS
或DFS
将与该元素和与该元素相接壤的元素都置为以访问过。然后再遍历一遍全部元素,将没被访问过且为O
的元素置为X
。
C++版整体代码(BFS)一:
class Solution {
public:
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void bfs(vector<vector<char>>& board, vector<vector<bool>>& visited, int x, int y){
queue<pair<int, int>> q;
q.push({x, y});
visited[x][y] = true;
while(!q.empty()){
pair<int, int> cur = q.front();
q.pop();
int curx = cur.first, cury = cur.second;
for(int i = 0; i < 4; i++){
int nextx = curx + dx[i], nexty = cury + dy[i];
if(nextx < 0 || nextx >= board.size() || nexty < 0 || nexty >= board[0].size()) continue;
if(board[nextx][nexty] == 'O' && !visited[nextx][nexty]){
q.push({nextx, nexty});
visited[nextx][nexty] = true;
}
}
}
}
void solve(vector<vector<char>>& board) {
int n = board.size(), m = board[0].size();
vector<vector<bool>> visited = vector<vector<bool>>(n, vector<bool>(m, false));
for(int i = 0; i < n; i++){
if(board[i][0] == 'O') bfs(board, visited, i, 0);
if(board[i][m - 1] == 'O') bfs(board, visited, i, m - 1);
}
for(int i = 0; i < m; i++){
if(board[0][i] == 'O') bfs(board, visited, 0, i);
if(board[n - 1][i] == 'O') bfs(board, visited, n - 1, i);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(board[i][j] == 'O' && !visited[i][j]) board[i][j] = 'X';
}
}
}
};
C++版整体代码(DFS):
class Solution {
public:
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, int x, int y){
visited[x][y] = true;
for(int i = 0; i < 4; i++){
int nextx = x + dx[i], nexty = y + dy[i];
if(nextx < 0 || nextx >= board.size() || nexty < 0 || nexty >= board[0].size()) continue;
if(board[nextx][nexty] == 'X' || visited[nextx][nexty]) continue;
dfs(board, visited, nextx, nexty);
}
return;
}
void solve(vector<vector<char>>& board) {
int n = board.size(), m = board[0].size();
vector<vector<bool>> visited = vector<vector<bool>>(n, vector<bool>(m, false));
for(int i = 0; i < n; i++){
if(board[i][0] == 'O') dfs(board, visited, i, 0);
if(board[i][m - 1] == 'O') dfs(board, visited, i, m - 1);
}
for(int i = 0; i < m; i++){
if(board[0][i] == 'O') dfs(board, visited, 0, i);
if(board[n - 1][i] == 'O') dfs(board, visited, n - 1, i);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(board[i][j] == 'O' && !visited[i][j]) board[i][j] = 'X';
}
}
}
};