BFS,开一个二维数组标记board中的元素是不是被访问过(初始化为false)。 然后从board边界处的'O'开始BFS,访问到的标记为true。
最后遍历标记数组,把未访问过的O改为X。
class Solution {
public:
void solve(vector<vector<char>> &board) {
// Start typing your Java solution below
// DO NOT write main() function
int i, j;
int row = board.size();
if (row < 2)
return;
int col = board[0].size();
if (col < 2)
return;
vector<vector<bool> > isVisted(row, vector<bool>(col, false));
int a[4] = { 0, 0, -1, 1 };
int b[4] = { -1, 1, 0, 0 };
for (i = 0; i < row; ++i) {
for (j = 0; j < col; ++j) {
if(!(i == 0 || j == 0 || i == row - 1 || j == col - 1)) continue;
if (!isVisted[i][j] && board[i][j] == 'O') {
isVisted[i][j] = true;
queue<int>p, q;
p.push(i);
q.push(j);
while (!q.empty()) {
int x = p.front();
p.pop();
int y = q.front();
q.pop();
// isVisted[x][y] = true; //开始把标记放到了这里而不是 A 处,导致超时, 分析发现是因为死循环了。
for (int k = 0; k < 4; ++k) {
int m = x + a[k];
int n = y + b[k];
if (m >= 0 && m < row && n >= 0 && n < col) {
if (!isVisted[m][n] && board[m][n] == 'O') {
p.push(m);
q.push(n);
isVisted[m][n] = true; // A 处
}
}
}
}
}
}
}
for(i = 0; i < row; i ++)
for(j = 0; j < col; j ++)
{
if(!isVisted[i][j] && board[i][j]=='O')
board[i][j] = 'X';
}
}
};