思路:bfs
这道题挺简单的把,就是感觉代码量有点大,主要思路是首先bfs找出所有的’O’块,然后每一个’O’块,如果有在边界的则全部变为’X’
class Solution {
public:
void solve(vector<vector<char>>& board) {
if (board.empty())return;
int mark[1000][1000];
int m = board.size();
int n = board[0].size();
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
memset(mark, 0, sizeof(mark));
queue<pair<int, int>>q;
pair<int, int>current;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
vector<pair<int, int>>vec;
if (mark[i][j] == 0&&board[i][j]=='O') {
mark[i][j] = 1;
q.push(make_pair(i, j));
vec.push_back(make_pair(i, j));
while (!q.empty()) {
current = q.front();
vec.push_back(make_pair(current.first, current.second));
q.pop();
for (int d = 0; d < 4; ++d) {
int tempx = current.first + dir[d][0];
int tempy = current.second + dir[d][1];
if(tempx<0||tempy<0||tempx>=m||tempy>=n)continue;
if (mark[tempx][tempy] == 0 && board[tempx][tempy] == 'O'){
mark[tempx][tempy] = 1;
q.push(make_pair(tempx, tempy));
}
}
}
//change
bool flag = true;
for (int k = 0; k < vec.size(); ++k) {
int x = vec[k].first;
int y = vec[k].second;
if (x == 0 || y == 0 || x == m - 1 || y == n - 1) {
flag = false;
break;
}
}
if (flag) {
for (int k = 0; k < vec.size(); ++k) {
board[vec[k].first][vec[k].second] = 'X';
}
}
}
}
}
}
};