【leetcode】SurroundedRegions
Question :
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
Anwser 1 :
DFS
class Solution { public: void DFS(vector<vector<char> > &board, int i, int j){ if(i >= board.size() || j >= board[0].size()) return; if(board[i][j] == 'O'){ board[i][j] = '#'; DFS(board, i-1, j); // to left DFS(board, i+1, j); // to right DFS(board, i, j-1); // to up DFS(board, i, j+1); // to down } } void solve(vector<vector<char>> &board) { // Start typing your C/C++ solution below // DO NOT write int main() function if(board.empty()) return; int len = board[0].size(); // one row length for(int i = 1; i < len - 1; i++){ DFS(board, i, 0); // left DFS(board, i, len-1); // right } for(int j = 0; j < len; j++){ DFS(board, 0, j); // up DFS(board, len-1, j); // down } //change 'O' to 'X' for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ if(board[i][j] == 'O') board[i][j] = 'X'; if(board[i][j] == '#') board[i][j] = 'O'; } } } };
Anwser 2 :
BFS
class Solution { public: void enQ(vector<vector<char>> &board, int row, int col, int len, queue<int> &qu){ if(row < 0 || row >= len || col < 0 || col >= len) return; if(board[row][col] == 'O'){ board[row][col] = '#'; qu.push(row * len + col); } } void BFS(vector<vector<char> > &board, int row, int col, int len, queue<int> &qu){ enQ(board, row, col, len, qu); while(!qu.empty()){ int val = qu.front(); qu.pop(); int row = val / len; int col = val % len; BFS(board, row-1, col, len, qu); // to left BFS(board, row+1, col, len, qu); // to right BFS(board, row, col-1, len, qu); // to up BFS(board, row, col+1, len, qu); // to down } } void solve(vector<vector<char>> &board) { // Start typing your C/C++ solution below // DO NOT write int main() function if(board.empty()) return; int len = board[0].size(); // one row length queue<int> Q; for(int i = 1; i < len - 1; i++){ BFS(board, i, 0, len, Q); // left BFS(board, i, len-1, len, Q); // right } for(int j = 0; j < len; j++){ BFS(board, 0, j, len, Q); // up BFS(board, len-1, j, len, Q); // down } //change 'O' to 'X' for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ if(board[i][j] == 'O') board[i][j] = 'X'; if(board[i][j] == '#') board[i][j] = 'O'; } } } };
Anwser 3 : BFS in
Java
public class Solution { int m,n; char[][] board; Queue<Integer> queue=new LinkedList<Integer>(); void fill(int x, int y){ if(x<0 || x>=m || y<0 || y>=n || board[x][y]!='O') return; queue.offer(x*m+y); board[x][y]='D'; } void bfs(int x, int y){ fill(x,y); while(!queue.isEmpty()){ int curr=queue.poll(); int i=curr/n; int j=curr%n; fill(i-1,j); fill(i+1,j); fill(i,j-1); fill(i,j+1); } } public void solve(char[][] board){ if(board==null || board.length==0) return; this.board=board; m=board.length; n=board[0].length; for(int j=0;j<n;j++){ bfs(0,j); bfs(m-1,j); } for(int i=1;i<m-1;i++){ bfs(i,0); bfs(i,n-1); } for(int i=0;i<m;i++) for(int j=0;j<n;j++){ if(board[i][j]=='O') board[i][j]='X'; else if(board[i][j]=='D') board[i][j]='O'; } } }
注意点:
1) 方法1通过,方法2不通过,方法3有时通过有时不通过(不通过与方法2编译错误一致)
2) 查了int在c++和java中类型,int在c++两个字节,在java占四个字节,这可能会导致push(int)值过大,但在方法2(c++)中把int改为long(4字节),编译仍不通过
3)
上面这个问题研究了很长一段时间,目前还没搞明白,大家看到这篇博客欢迎来探讨、指正
参考推荐:
Leetcode 130: Surrounded Regions
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2013-04-14 15:54:21
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!