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
思路是从外围开始找O,将找到的改为'*',最后遍历将0改为1,将*改为0。
分别可以用BFS和DFS来做。
struct POS
{
int x;
int y;
POS(int xx,int yy):x(xx),y(yy){}
};
class Solution {
public:
int row;
int col;
void DFS(vector<vector<char>>& board, int i, int j) //深度遍历 栈
{
int a[4] = {1, 0, -1, 0};
int b[4] = {0, 1, 0, -1};
stack<POS*> pos;
pos.push(new POS(i,j));
board[i][j] = '*';
bool isfind;
while (!pos.empty())
{
POS *front = pos.top();
int i;
isfind = false;
for (i = 0; i < 4; i++)
{
if (isvalid(front->x + a[i], front->y + b[i]) && board[front->x + a[i]][front->y + b[i]] == 'O')
{
pos.push(new POS(front->x + a[i], front->y + b[i]));
board[front->x + a[i]][front->y + b[i]] = '*';
isfind = true;
break;
}
}
if (isfind)
continue;
pos.pop();
}
}
void BFS(vector<vector<char>>& board, int i, int j) //广度遍历 队列
{
int a[4] = {1, 0, -1, 0};
int b[4] = {0, 1, 0, -1};
queue<POS*> pos;
pos.push(new POS(i,j));
board[i][j] = '*';
while(!pos.empty())
{
POS *front = pos.front();
pos.pop();
for (int i = 0; i < 4; i++)
{
if (isvalid(front->x + a[i], front->y + b[i]) && board[front->x + a[i]][front->y + b[i]] == 'O')
{
pos.push(new POS(front->x + a[i], front->y + b[i]));
board[front->x + a[i]][front->y + b[i]] = '*';
}
}
}
}
bool isvalid(int i, int j)
{
return i >= 0 && i < row && j >=0 && j < col;
}
void solve(vector<vector<char>>& board)
{
row = board.size();
if (row == 0)
return;
col = board[0].size();
if (col == 0)
return;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if(board[i][j] == 'O' && (i == 0 || j == 0 || i == row - 1 || j == col - 1) )
{
//BFS(board, i, j);
DFS(board, i, j);
}
}
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == 'O')
board[i][j] = 'X';
else if (board[i][j] == '*')
board[i][j] = 'O';
}
}
}
};