問題描述
給定一個二維的矩陣,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
圍繞的區域,並將這些區域裏所有的 'O'
用 'X'
填充。
示例:
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
解釋:
被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 'O
’ 都不會被填充爲 'X'
。 任何不在邊界上,或不與邊界上的 'O'
相連的 'O'
最終都會被填充爲 'X'
。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
解題報告
- 初始化時將邊界處的
'O'
的放入隊列中,同時將該處的'O'
換成其他字母,例如'Q'
; - 之後
BFS
搜索,當搜到符合條件的'O'
時,壓入隊列中,將其置爲'Q'
; BFS
結束後,將矩陣中的'Q'
置爲'O'
,其他置爲'X'
。
這題還可以用 並查集 實現,待補充。
實現代碼
class Solution {
public:
unordered_map<int,int>parent;
unordered_map<int,int>cnt;
void solve(vector<vector<char>>& board) {
if(board.size()==0) return;
int m=board.size(), n=board[0].size();
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
queue<pair<int,int>>q;
for(int i=0;i<m;i++){
if(board[i][0]=='O'){
q.push({i,0});
board[i][0]='Q';
}
if(board[i][n-1]=='O'){
q.push({i,n-1});
board[i][n-1]='Q';
}
}
for(int j=0;j<n;j++){
if(board[0][j]=='O'){
q.push({0,j});
board[0][j]='Q';
}
if(board[m-1][j]=='O'){
q.push({m-1,j});
board[m-1][j]='Q';
}
}
// cout<<q.size()<<endl;
while(!q.empty()){
pair<int, int>one=q.front();
q.pop();
for(int i=0;i<4;i++){
int x=one.first+dx[i];
int y=one.second+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'){
q.push({x,y});
board[x][y]='Q';
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='Q') board[i][j]='O';
else board[i][j]='X';
}
}
}
};