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
Have you been asked this question in an interview?
这道题直观看就是图论,然后是BFS或DFS,它们有同样的最坏时间复杂度,BFS消耗空间,空间复杂度比较高,DFS比较适合比较扁平的图(深度不大,广度大),BFS适合比较狭长的图(广度不大,深度大)。另外对于无权重图,BFS适合找最短路径,但只能记录一条最短路径;DFS能记录所有路径,但这些路径不一定是最短的。。。
等等吧,这些也是最近对BFS和DFS的一点总结。
这道题我使用了DFS,第一思路是正向思维,逐行扫描‘O’,然后以每个‘O’为起点DFS,扫到了染色‘O’为‘Y’,若碰到了矩阵的边,设置全局flag为true,然后替换‘Y’为‘Z’,若木有碰到边,设置全局变量flag为false,然后替换‘Y’为‘X’。最后将所有的‘Z’替换成‘O’。
写完一运行,TLS了。
后来参考别人的写法,采用逆向思维,从矩阵的四条边扫描, 以每个‘O’为起点DFS ,扫到了染色‘O’为‘Z’,扫描完毕后,所有剩下的‘O’就是被‘X’完全包围的, 将它们替换成‘X’,将所有的‘Z’替换成‘O’。
代码如下:
点击(此处)折叠或打开
- queue<int> q;
- int m, n;
-
- void add(int x, int y, vector<vector<char>> &board) {
- if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {
- board[x][y] = 'Z';
- q.push(x * n + y);
- }
- }
-
- void traversal(int x, int y, vector<vector<char>> &board) {
- add(x, y, board);
- while (!q.empty()) {
- int p = q.front();
- q.pop();
- int px = p / n, py = p % n;
- add(px - 1, py, board);
- add(px + 1, py, board);
- add(px, py - 1, board);
- add(px, py + 1, board);
- }
- }
-
- void solve(vector<vector<char>> &board) {
- if (board.empty() || board.size() == 0 || board[0].size() == 0) {
- return;
- }
- m = board.size(), n = board[0].size();
- for (int i = 0; i < n; i++) {
- traversal(0, i, board);
- traversal(m - 1, i, board);
- }
- for (int i = 0; i < m; i++) {
- traversal(i, 0, board);
- traversal(i, n - 1, board);
- }
- for (int i = 0; i < m; i++) {
- for (int j = 0; j < n; j++) {
- board[i][j] = board[i][j] == 'Z' ? 'O' : 'X';
- }
- }
- }
相关热门文章
给主人留下些什么吧!~~
评论热议