130. Surrounded Regions

来源:互联网 发布:创业软件 俞青 编辑:程序博客网 时间:2024/06/15 20:46

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 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

answer:

typedef struct{    int x, y;}Node;class Solution {public:    void solve(vector<vector<char> >& board) {        int row = board.size();        if(row == 0) return;        int col = board[0].size();        bool visit[row * col] = {false};        vector<Node> cube;        for(int i = 0; i < row; i ++){            for(int j = 0; j < col; j ++){                if(board[i][j] == 'O' && !visit[i * col + j]){                    bool change = true;                    Node node = {i, j};                    cube.push_back(node);                    visit[i * col + j] = true;                    int start = 0;                    while(start < cube.size()){                        Node temp = cube[start];                        if(temp.x > 0){                            int neighber = (temp.x - 1) * col + temp.y;                            Node near = {temp.x - 1, temp.y};                            if(!visit[neighber] && board[temp.x - 1][temp.y] == 'O'){                                cube.push_back(near);                                visit[neighber] = true;                            }                        }                        else                            change = false;                        if(temp.y < col - 1){                            int neighber = temp.x * col + temp.y + 1;                            Node near = {temp.x, temp.y + 1};                            if(!visit[neighber] && board[temp.x][temp.y + 1] == 'O'){                                cube.push_back(near);                                visit[neighber] = true;                            }                        }                        else    change = false;                        if(temp.x < row - 1){                            int neighber = (temp.x + 1) * col + temp.y;                            Node near = {temp.x + 1, temp.y};                            if(!visit[neighber] && board[temp.x + 1][temp.y] == 'O'){                                cube.push_back(near);                                visit[neighber] = true;                            }                        }                        else    change = false;                        if(temp.y > 0){                            int neighber = temp.x * col + temp.y - 1;                            Node near = {temp.x, temp.y - 1};                            if(!visit[neighber] && board[temp.x][temp.y - 1] == 'O'){                                cube.push_back(near);                                visit[neighber] = true;                            }                        }                        else    change = false;                        start ++;                    }                    if(change){                        for(int i = 0; i < cube.size(); i ++){                            Node temp = cube[i];                            board[temp.x][temp.y] = 'X';                        }                    }                    cube.clear();                }            }        }    }};