[LeetCode] Surrounded Regions

Surrounded Regions Feb 22

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

 

class Solution {
public:
    void solve(vector<vector<char>> &board) {
    if (board.size() == 0 ) return ;
    vector<vector<bool> > flag(board.size());
    for (int i = 0; i < board.size(); ++i) {
        flag[i].resize(board.size(), false);
    }
    int dx[] = {0, 0, -1, 1};
    int dy[] = {1, -1, 0, 0};
    char xxx = 'X';
    for (int i = 1; i < board.size() - 1; ++i) {
        for (int j = 1; j < board.size() - 1; ++j) {
            if (flag[i][j]) continue;
            // flood fill
            if (board[i][j] == 'O') {
                set<pair<int, int> > s;
                queue<int> q;
                s.insert(make_pair(i, j));
                flag[i][j] = true;
                 q.push(i);
                q.push(j);
                bool is_fill = true;
                while (!q.empty()) {
                    int x = q.front(); q.pop();
                    int y = q.front(); q.pop();
                     for (int k = 0; k < 4; ++k) {
                        if (x+dx[k] < 0 || x+dx[k] >= board.size() || 
                                y+dy[k] < 0 || y+dy[k] >= board.size() )
                            continue;
                        if (flag[x+dx[k]][y+dy[k]]) continue;
                        if (board[x+dx[k]][y+dy[k]] == 'O') {
                            flag[x+dx[k]][y+dy[k]] = true;
                            s.insert(make_pair(x+dx[k], y+dy[k]));
                            q.push(x+dx[k]);
                            q.push(y+dy[k]);
                            if (!is_fill || x+dx[k] == 0 || x+dx[k] == board.size()-1 ||
                                    y+dy[k] == 0 || y+dy[k] == board.size() - 1)
                                is_fill = false;
                        }
                    }
                }
                
                 if (is_fill) {
                    for (auto it = s.begin(); it != s.end(); ++it) {
                        board[it->first][it->second] = xxx;
                    }
                 }
            }
        }
    }
}

};

脑残,又写一遍。

class Solution {
public:
    void solve(vector<vector<char>> &board) {
        if (board.size() ==0 ) return;
        vector<vector<bool> > m(board.size());
        for (int i = 0; i < board.size(); ++i) {
            m[i].resize(board[i].size());
            fill(m[i].begin(), m[i].end(), 0);
        }
        
        for (int i = 0; i < board.size(); ++i) {
            floodfill(i, 0, board, m);
            floodfill(i, board[i].size()-1, board, m);
        }
        for (int i = 0; i < board[0].size(); ++i) {
            floodfill(0, i, board, m);
            floodfill(board.size()-1, i, board, m);
        }
        
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[i].size(); j++) {
                if (board[i][j] == 'O' && m[i][j] == false)
                  board[i][j] = 'X';
            }
        }
    }
    
    void floodfill(int r, int c, const vector<vector<char>>& board, vector<vector<bool>>& m) {
        if (board[r][c] == 'X' || m[r][c] == true) return;
        queue<pair<int,int> > q;
        int x,y, x2, y2;
        const int dx[] = {0, 0, 1, -1};
        const int dy[] = {1, -1, 0, 0};
        q.push(make_pair(r,c));
        m[r][c] = true;
        while (!q.empty()) {
            x = q.front().first;
            y = q.front().second;
            q.pop();
            for (int i = 0; i < 4; i++) {
                x2 = x + dx[i];
                y2 = y + dy[i];
                if (inrange(x2, y2, board) && board[x2][y2] == 'O' && m[x2][y2] == false) {
                    m[x2][y2] = true;
                    q.push(make_pair(x2, y2));
                }
            }
        }
    }
    bool inrange(int i, int j, const vector<vector<char>>& b) {
        return i >=0 && j >= 0 && i < b.size() && j < b[0].size();
    }
};
class Solution {
public:
    int n, m;
    vector<vector<bool> > v;
    void solve(vector<vector<char>> &board) {
        auto &a = board;
        n = a.size();
        if (n == 0) return;
        m = a[0].size();
        v.clear();
        for (int i = 0; i < n; i++) {
            v.push_back(vector<bool>(m, 0));
        }
        
        //floodfill
        queue<int> x, y;
        for (int i = 0; i < m; i++) {
            if (a[0][i] == 'O') x.push(0), y.push(i);
            if (a[n-1][i] == 'O') x.push(n-1), y.push(i);
        }
        for (int i = 1; i < n-1; i++) {
            if (a[i][0] == 'O') x.push(i), y.push(0);
            if (a[i][m-1] == 'O') x.push(i), y.push(m-1);
        }
        int dx[] = {-1, 1, 0, 0};
        int dy[] = {0, 0, -1, 1};
        while (!x.empty()) {
            int curx = x.front(); x.pop();
            int cury = y.front(); y.pop();
            if (v[curx][cury] == true || a[curx][cury] != 'O') continue;
            v[curx][cury] = true;
            a[curx][cury] = '.';
            
            for (int i = 0; i < 4; i++) {
                if (isOK(curx+dx[i], cury+dy[i]) && a[curx+dx[i]][cury+dy[i]] == 'O') {
                    x.push(curx+dx[i]);
                    y.push(cury+dy[i]);
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j] == '.') a[i][j] = 'O';
                else if (a[i][j] == 'O') a[i][j] = 'X';
            }
        }
    }
    
    bool isOK(int x, int y) {
        return x >= 0 && x < n && y >= 0 && y < m && v[x][y] == false;
    }

};

猜你喜欢

转载自cozilla.iteye.com/blog/1821921