LeetCode|Surrounded Regions

来源:互联网 发布:淘宝店铺一年费用多少 编辑:程序博客网 时间:2024/05/21 19:25

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 XX O O XX X O XX O X X

After running your function, the board should be:

X X X XX X X XX X X XX O X X

思路:
O如果在出现在边缘则没有被围住。最朴素的想法是搜索找有没有碰到边界。我第一次用DFS做的,大数据,200*200的矩阵,发生 Runtime Error ,原因理所应当的爆栈了。尝试过inline也不能通过。
贴上DFS的代码:

class Solution {public:    void solve(vector<vector<char> >& board) {        if((m = board.size()) == 0 || (n = board[0].size()) == 0) return;        for(int i = 0; i < m; i++)            for(int j = 0; j < n; j++){                if(board[i][j] == 'O'){                    bool captured = dfs(board, i, j);                    if(captured) flipping(board, i, j);                }            }        for(int i = 0; i < m; i++)            for(int j = 0; j < n; j++){                if(board[i][j] == 'o')                    board[i][j] = 'O';            }    }private:    int m, n;    int di[4] = {1, -1, 0 ,0};    int dj[4] = {0, 0, -1, 1};    bool dfs(vector<vector<char> >& grid, int i, int j){        grid[i][j] = 'o';        for(int k = 0; k < 4; k++){            int newi = i + di[k];            int newj = j + dj[k];            if(newi < 0 || newi == m || newj < 0 || newj == n) return false;            if(grid[newi][newj] == 'O' && !dfs(grid, newi, newj)) return false;        }  return true; // true for captured    }    void flipping(vector<vector<char> >& grid, int i, int j){        grid[i][j] = 'X';        for(int k = 0; k < 4; k++){            int newi = i + di[k];            int newj = j + dj[k];            if(newi < 0 || newi == m || newj < 0 || newj == n) continue;            if(grid[newi][newj] == 'o') flipping(grid, newi, newj);        }    }};

再次考虑,只有边界的O才需要保留。搜索边界把O用BFS标记一下,然后遍历内部,碰到的其他的O直接改为X。
TBD 需要补一下深搜、宽搜在栈空间、内存使用上的相关知识再回来做。

0 0
原创粉丝点击