Surrounded Regions
Given a 2D 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.
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
用dfs试试,大数据时递归会溢出
1 class Solution { 2 public: 3 void solve(vector<vector<char>> &board) { 4 int m=board.size(); 5 if(m==0) return; 6 int n=board[0].size(); 7 8 vector<vector<bool>> visited(m,vector<bool>(n,false)); 9 for(int i=0;i<m;i++) 10 { 11 if(board[i][0]==‘O‘&&!visited[i][0]) 12 { 13 dfs(board,visited,i,0,m,n); 14 } 15 16 if(board[i][n-1]==‘O‘&&!visited[i][n-1]) 17 { 18 dfs(board,visited,i,n-1,m,n); 19 } 20 } 21 22 for(int j=0;j<n;j++) 23 { 24 25 if(board[0][j]==‘O‘&&!visited[0][j]) 26 { 27 dfs(board,visited,0,j,m,n); 28 } 29 30 if(board[m-1][j]==‘O‘&&!visited[m-1][j]) 31 { 32 dfs(board,visited,m-1,j,m,n); 33 } 34 35 } 36 37 38 for(int i=0;i<m;i++) 39 { 40 for(int j=0;j<n;j++) 41 { 42 if(board[i][j]==‘O‘&&visited[i][j]) 43 { 44 board[i][j]=‘X‘; 45 } 46 } 47 } 48 49 return; 50 } 51 52 void dfs(vector<vector<char>> &board,vector<vector<bool>> &visited,int i,int j,int &m,int &n) 53 { 54 if(board[i][j]==‘O‘) 55 { 56 visited[i][j]=true; 57 if(i+1<m&&visited[i+1][j]==false)dfs(board,visited,i+1,j,m,n); 58 if(j+1<n&&visited[i][j+1]==false)dfs(board,visited,i,j+1,m,n); 59 if(i-1>=0&&visited[i-1][j]==false)dfs(board,visited,i-1,j,m,n); 60 if(j-1>=0&&visited[i][j-1]==false)dfs(board,visited,i,j-1,m,n); 61 } 62 else 63 { 64 return; 65 } 66 } 67 };
利用广度优先搜索,先把边界上的O全部放到队列中,然后搜索
1 class Solution { 2 public: 3 void solve(vector<vector<char>> &board) { 4 int m=board.size(); 5 if(m==0) return; 6 int n=board[0].size(); 7 8 queue<pair<int,int>> q; 9 10 vector<vector<bool>> visited(m,vector<bool>(n,false)); 11 for(int i=0;i<m;i++) 12 { 13 if(board[i][0]==‘O‘) q.push(pair<int,int>(i,0)); 14 if(board[i][n-1]==‘O‘) q.push(pair<int,int>(i,n-1)); 15 } 16 17 for(int j=0;j<n;j++) 18 { 19 if(board[0][j]==‘O‘) q.push(pair<int,int>(0,j)); 20 if(board[m-1][j]==‘O‘) q.push(pair<int,int>(m-1,j)); 21 } 22 23 bfs(q,board,visited,m,n); 24 25 for(int i=0;i<m;i++) 26 { 27 for(int j=0;j<n;j++) 28 { 29 if(!visited[i][j]&&board[i][j]==‘O‘) board[i][j]=‘X‘; 30 } 31 } 32 } 33 34 35 void bfs(queue<pair<int,int>> &q,vector<vector<char>> &board,vector<vector<bool>> &visited,int &m,int &n) 36 { 37 while(!q.empty()) 38 { 39 int ii=q.front().first; 40 int jj=q.front().second; 41 visited[ii][jj]=true; 42 43 q.pop(); 44 45 if(ii+1<m&&!visited[ii+1][jj]&&board[ii+1][jj]==‘O‘) q.push(pair<int,int>(ii+1,jj)); 46 if(ii-1>=0&&!visited[ii-1][jj]&&board[ii-1][jj]==‘O‘) q.push(pair<int,int>(ii-1,jj)); 47 if(jj+1<n&&!visited[ii][jj+1]&&board[ii][jj+1]==‘O‘) q.push(pair<int,int>(ii,jj+1)); 48 if(jj-1>=0&&!visited[ii][jj-1]&&board[ii][jj-1]==‘O‘) q.push(pair<int,int>(ii,jj-1)); 49 } 50 } 51 };
时间: 2024-10-26 04:02:56