[Medium]Surrounded Regions

来源:互联网 发布:淘宝商家开通花呗 编辑:程序博客网 时间:2024/06/05 09:02

问题:
Given a 2D board containing ‘X’ and ‘O’ (the letter 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:    vector<int> f;    int fa(int a) {        if (f[a] == a) return a;        f[a] = fa(f[a]);        return f[a];    }    void un(int a, int b) {        f[a] = fa(f[a]);        f[b] = fa(f[b]);        if (f[a] == f[b]) return;        f[f[a]] = f[b];    }    void solve(vector<vector<char>>& board) {        int n = board.size();        if (n == 0) return;        int m = board[0].size(), i, j, len = m * n;        f.resize(len);        for (int p = 0; p < len; ++p) {            i = p / m; j = p % m;            if (board[i][j] == 'O') {f[p] = p;} else f[p] = -1;        }        for (int p = 0; p < len; ++p) {            if (f[p] == -1) continue;            i = p / m; j = p % m;            if (i && board[i-1][j] == 'O') un(p, p-m);            if (j && board[i][j-1] == 'O') un(p, p-1);        }        for (int p = 0; p < len; ++p) {            if (f[p] != -1) fa(p);        }        for (i = 0; i < n; ++i) {            if (f[i*m] != -1) {                int p = f[i*m];                int i1 = p / m, j1 = p % m;                board[i1][j1] = 'U';            }            if (f[i*m+m-1] != -1) {                int p = f[i*m+m-1];                int i1 = p / m, j1 = p % m;                board[i1][j1] = 'U';            }        }        for (j = 0; j < m; ++j) {            if (f[j] != -1) {                int p = f[j];                int i1 = p / m, j1 = p % m;                board[i1][j1] = 'U';            }            if (f[n*m-m+j] != -1) {                int p = f[n*m-m+j];                int i1 = p / m, j1 = p % m;                board[i1][j1] = 'U';            }        }        for (int p = 0; p < len; ++p) {            if (f[p] == -1) continue;            i = f[p] / m; j = f[p] % m;            int i1 = p / m; int j1 = p % m;            if (board[i][j] == 'O' || board[i][j] == 'X') board[i1][j1] = 'X';        }        for (int p = 0; p < len; ++p) {            if (f[p] == -1) continue;            i = f[p] / m; j = f[p] % m;            if (board[i][j] == 'U') board[i][j] = 'O';        }    }};
0 0
原创粉丝点击