Surrounded Regions

来源:互联网 发布:print在vb中什么意思 编辑:程序博客网 时间:2024/05/23 00:04
/*  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 XAfter running your function, the board should be:X X X XX X X XX X X XX O X X遍历矩阵,遇到O就判断其四周是否也为O,或者该点是否在边界处,如果四周有节点为O且这些节点在边界内,把改点加入到队列中,且把这个点放进待消灭的vector中,如果返回false,即找不到被围起来的O点,不处理 如果返回true,则把对应的O位置改为X  */#include <iostream>#include <stdlib.h>#include <set>#include <vector>#include <queue>using namespace std;bool isSurrounded(const vector<vector<char> >& board, set<int>& visited,int grid,vector<int>& grids){        queue<int> q;        q.push(grid);        //四个方向     int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};        bool sign = true;        grids.push_back(grid);        visited.insert(grid);        while(!q.empty())        {            grid = q.front();            q.pop();            int row = grid/board[0].size(), col = grid%board[0].size();            if(row==0||row==board.size()-1||col==0||col==board[0].size()-1)                sign = false;            for(int i=0;i<4;i++)            {                int pos = dir[i][0]*board[0].size()+dir[i][1]+grid;                if(pos<0||pos>=board[0].size()*board.size()) continue;                if(board[pos/board[0].size()][pos%board[0].size()]=='O'&&                    visited.find(pos)==visited.end())                    {                        grids.push_back(pos);                        visited.insert(pos);                        q.push(pos);                    }            }        }        return sign;    }    void solve(vector<vector<char> > &board) {        if(board.size()==0) return;        set<int> visited;        for(int i=0;i<board.size();i++)            for(int j=0;j<board[0].size();j++)            {                vector<int> grids;                if(board[i][j]=='O'&&visited.find(i*board[0].size()+j)==visited.end())                {                    if(isSurrounded(board,visited,i*board[0].size()+j,grids))                    {                        for(vector<int>::iterator ite=grids.begin();ite!=grids.end();ite++)                            board[(*ite)/board[0].size()][(*ite)%board[0].size()] = 'X';                    }                }            }    }int main(){    vector<vector<char> > board;    vector<char> row;    row.push_back('X');    row.push_back('X');    row.push_back('X');    row.push_back('X');    board.push_back(row);        row.clear();    row.push_back('X');    row.push_back('O');    row.push_back('O');    row.push_back('X');    board.push_back(row);        row.clear();    row.push_back('X');    row.push_back('X');    row.push_back('O');    row.push_back('X');    board.push_back(row);        row.clear();    row.push_back('X');    row.push_back('O');    row.push_back('X');    row.push_back('X');    board.push_back(row);        for(int i=0; i<board.size(); i++) {       for(int j=0; j<board[0].size(); j++)         cout << board[i][j];       cout << endl;    }        cout << endl << "Result" << endl;    solve(board);        for(int i=0; i<board.size(); i++) {       for(int j=0; j<board[0].size(); j++)         cout << board[i][j];       cout << endl;    }        system("pause");    return 0;}

原创粉丝点击