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
分析:解此题的关键是发现一条隐含的规律:如果一个‘O’不能被'X'包围的话,那么与该‘O’相邻的其他'O'也不能被'X'包围。而且所有不能被'X'包围的'O'都起始于board的四个边缘。因为我们可以用搜索的方法标注所有不能被'X'包围的‘O’,标注完成后,再遍历一遍board把未被标注的'O'改为‘X’。遍历的可以用bfs和dfs,但当board比较大时dfs递归层数太多会引起runtime error,所以bfs对于大数据比较合适。
dfs代码:
class Solution {
public:
    void solve(vector<vector<char>> &board) {
        int m = board.size();
        if(m == 0) return;
        int n = board[0].size();
        if(n == 0) return;
        
        for(int i = 0; i < n; i++)
            if(board[0][i] == 'O') dfs(board, 0, i);
        for(int i = 1; i < m-1; i++)
            if(board[i][0] =='O') dfs(board, i, 0);
        for(int i = 1; i < m-1; i++)
            if(board[i][n-1] == 'O') dfs(board, i, n-1);
        for(int i = 0; i < n; i++)
            if(board[m-1][i] == 'O') dfs(board, m-1, i);
        
        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] == '+')
                    board[i][j] = 'O';
            }
    }
    void dfs(vector<vector<char>> &board, int i, int j){
        board[i][j] = '+';
        if(i > 0 && board[i-1][j] == 'O')
            dfs(board, i-1, j);
        if(i < board.size()-1 && board[i+1][j] == 'O')
            dfs(board, i+1, j);
        if(j > 0 && board[i][j-1] == 'O')
            dfs(board, i, j-1);
        if(j < board[0].size()-1 && board[i][j+1] == 'O')
            dfs(board, i, j+1);
    }
};

bfs代码:

class Solution {
public:
    void solve(vector<vector<char>> &board) {
        int m = board.size();
        if(m == 0) return;
        int n = board[0].size();
        if(n == 0) return;
        
        for(int i = 0; i < n; i++)
            if(board[0][i] == 'O') bfs(board, 0, i);
        for(int i = 1; i < m-1; i++)
            if(board[i][0] =='O') bfs(board, i, 0);
        for(int i = 1; i < m-1; i++)
            if(board[i][n-1] == 'O') bfs(board, i, n-1);
        for(int i = 0; i < n; i++)
            if(board[m-1][i] == 'O') bfs(board, m-1, i);
        
        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] == '+')
                    board[i][j] = 'O';
            }
    }
    void bfs(vector<vector<char>> &board, int i, int j){
        queue<pair<int, int>> Q;
        board[i][j] = '+';
        Q.push(make_pair(i,j));
        while(!Q.empty()){
            auto tmp = Q.front();
            Q.pop();
            if(tmp.first > 0 && board[tmp.first-1][tmp.second] == 'O'){
                board[tmp.first-1][tmp.second] = '+';
                Q.push(make_pair(tmp.first-1,tmp.second));
            }
            if(tmp.first < board.size()-1 && board[tmp.first+1][tmp.second] == 'O'){
                board[tmp.first+1][tmp.second] = '+';
                Q.push(make_pair(tmp.first+1,tmp.second));
            }
            if(tmp.second > 0 && board[tmp.first][tmp.second-1] == 'O'){
                board[tmp.first][tmp.second-1] = '+';
                Q.push(make_pair(tmp.first,tmp.second-1));
            }
            if(tmp.second < board[0].size()-1 && board[tmp.first][tmp.second+1] == 'O'){
                board[tmp.first][tmp.second+1] = '+';
                Q.push(make_pair(tmp.first,tmp.second+1));
            }
        }
    }
};

 

posted on 2014-10-24 22:31  Ryan-Xing  阅读(160)  评论(0编辑  收藏  举报