您的位置:首页 > 其它

Surrounded Regions

2015-06-21 16:46 323 查看
Description:

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

Code:

struct vertex
{
int row;
int col;
vertex (int x, int y):row(x),col(y)
{

}
};

void BFSTraverse (vector< vector<char> >& board, int i, int j)
{//因为值被修改为'S'就说明该元素已被访问,所以本题中可以不用另外的变量记录访问状态
board[i][j] = 'S';
deque<vertex>m;
m.push_back( vertex(i,j) );
while ( !m.empty() )
{
vertex v = m.front();
m.pop_front();

int mRow = v.row-1;
if ( mRow >=0 && board[mRow][v.col] == 'O')
{//上面的元素
board[mRow][v.col] = 'S';
m.push_back( vertex(mRow, v.col) );
}
mRow = v.row+1;
if ( mRow < board.size() && board[mRow][v.col] == 'O')
{//下面的元素
board[mRow][v.col] = 'S';
m.push_back( vertex(mRow, v.col) );
}
int mCol = v.col - 1;
if ( mCol >=0 && board[v.row][mCol] == 'O')
{//左面的元素
board[v.row][mCol] = 'S';
m.push_back( vertex(v.row, mCol));
}
mCol = v.col + 1;
if ( mCol < board[0].size()  && board[v.row][mCol] == 'O' )
{//右面的元素
board[v.row][mCol] = 'S';
m.push_back( vertex(v.row, mCol));
}
}
}

void solve(vector< vector<char> >& board)
{
int row = board.size();
if ( row!=0 )
{
int col = board[0].size();
for (int j = 0; j < col; ++j)
{
if ( board[0][j] == 'O')
BFSTraverse (board, 0, j);
if ( board[row-1][j] == 'O')
BFSTraverse (board, row-1, j);
}
for (int i = 1;  i < row-1; ++i)
{
if ( board[i][0] == 'O')
BFSTraverse (board, i, 0);
if ( board[i][col-1] == 'O' )
BFSTraverse (board, i, col-1);
}

for (int  i = 0; i < row; ++i )
{
for ( int j = 0; j < col; ++j )
{
if (board[i][j] == 'S')
board[i][j] = 'O';
else if (board[i][j] == 'O')
board[i][j] = 'X';
else
;
}
}//for
}//if
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: