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