题目简介:
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
1 2 3 4
| X X X X X O O X X X O X X O X X
|
运行你的函数后,矩阵变为:
1 2 3 4
| X X X X X X X X X X X X X O X X
|
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
思路:
由于最后不会变成X
的O
(即没有被围绕),必定是直接或间接与边界上的O
相连的,所以利用广度优先遍历,先将边界上的O
入队,再去寻找直接或间接与其相连的点,并都设为S
(做标记),最后再遍历一次矩阵,将S
的点都设为O
,其余的都为X
即可。
tips
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| class Solution { public: void solve(vector<vector<char>>& board) {
if(board.size() == 0) return;
queue<pair<int, int>> qu;
int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0};
int n = board.size(); int m = board[0].size();
for(int i = 0; i < n; i++){
if(board[i][0] == 'O') qu.emplace(i, 0); if(board[i][m - 1] == 'O') qu.emplace(i, m - 1); } for(int j = 1; j < m - 1; j++){
if(board[0][j] == 'O') qu.emplace(0, j); if(board[n - 1][j] == 'O') qu.emplace(n - 1, j); }
while(!qu.empty()){ auto temp = qu.front(); qu.pop();
int now_x = temp.first; int now_y = temp.second;
board[now_x][now_y] = 'S';
for(int i = 0; i < 4; i++){
int x = now_x + dx[i]; int y = now_y + dy[i];
if(x >= 0 && x < n && y >= 0 && y < m){
if(board[x][y] == 'O') qu.emplace(x, y); } } }
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(board[i][j] == 'S') board[i][j] = 'O'; else board[i][j] = 'X'; } }
} };
|