1. 程式人生 > 實用技巧 >130. 被圍繞的區域 - 8月11日

130. 被圍繞的區域 - 8月11日

題目

130. 被圍繞的區域

我的思路

找到四周邊界上是‘O’的位置,然後向內部深搜或者廣搜。把連通的‘O’修改為‘K’。之後再把所有‘K’置‘O’,而未被修改過的‘O’也就是被包圍的不連通的,置‘X’。

我的實現

class Solution {
public:
    const int dx[4] = {1, -1, 0, 0};
    const int dy[4] = {0, 0, 1, -1};

    void solve(vector<vector<char
>>& board) { int n = board.size(); if (n == 0) { return; } int m = board[0].size(); queue<pair<int, int>> que; for (int i = 0; i < n; i++) { if (board[i][0] == 'O') { que.emplace(i, 0); }
if (board[i][m - 1] == 'O') { que.emplace(i, m - 1); } } for (int i = 1; i < m - 1; i++) { if (board[0][i] == 'O') { que.emplace(0, i); } if (board[n - 1][i] == 'O') { que.emplace(n - 1
, i); } } while (!que.empty()) { int x = que.front().first, y = que.front().second; que.pop(); board[x][y] = 'A'; for (int i = 0; i < 4; i++) { int mx = x + dx[i], my = y + dy[i]; if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') { continue; } que.emplace(mx, my); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') { board[i][j] = 'O'; } else if (board[i][j] == 'O') { board[i][j] = 'X'; } } } } };

深搜or廣搜

時間複雜度是on,矩陣的大小

拓展學習