1. 程式人生 > 實用技巧 >LeetCode 130. 被圍繞的區域 bfs

LeetCode 130. 被圍繞的區域 bfs

地址https://leetcode-cn.com/problems/surrounded-regions/

給定一個二維的矩陣,包含'X''O'(字母 O)。

找到所有被 'X' 圍繞的區域,並將這些區域裡所有的'O''X' 填充。

示例:

X X X X
X O O X
X X O X
X O X X
執行你的函式後,矩陣變為:

X X X X
X X X X
X X X X
X O X X
解釋:

被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的'O'都不會被填充為'X'。 任何不在邊界上,或不與邊界上的'O'相連的'O'最終都會被填充為'X'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。

演算法1
本題目使用BFS 找出與邊連線的’O’,那麼剩下的’O’就是需要填寫為’X’的。
考慮到鄰接特性 所以使用並查集也是可以的

class Solution {
public:
   
int addx[4] = { 1,-1,0,0 };
int addy[4] = { 0,0,-1,1 };


void solve(vector<vector<char>>& board) {
    if (board.size() == 0 || board[0].size() == 0) return;
    
int n = board.size(); int m = board[0].size(); queue<pair<int, int>> q; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if ( (i == 0 || j == 0 || i == n - 1 || j == m-1 ) && board[i][j] == 'O') { //只要是邊上的 O 就放入BFS搜尋隊列 board[i][j] = '
T'; q.push({ i,j }); } } } while (q.size()) { int x = q.front().first; int y = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int newx = x + addx[i]; int newy = y + addy[i]; if (newx >= 0 && newx < n && newy >= 0 && newy < m && board[newx][newy] == 'O') { board[newx][newy] = 'T'; q.push({ newx,newy }); } } } //遍歷完成後 所有與邊相鄰的O 變成了T //我需要全部填充X 然後將T變成O 即可 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'T') { board[i][j] = 'O'; } else if (board[i][j] != 'X') { board[i][j] = 'X'; } } } return; } };