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
| class Solution { public: int shortestBridge(vector<vector<int>>& A) { m = A.size(), n = A[0].size(); auto [r, c] = getRC(A); int res = 0; auto &&q = update(A, r, c); while (!q.empty()) { ++res; for (int i = q.size(); i > 0; --i) { auto [r, c] = q.front(); q.pop(); for (int j = 0; j < 4; ++j) { int rr = r + dr[j], cc = c + dc[j]; if (!isValid(rr, cc)) continue; if (A[rr][cc] == 0) { q.emplace(rr, cc); A[rr][cc] = 2; } else if (A[rr][cc] == 1) return res; } } } return res; }
pair<int, int> getRC(vector<vector<int>> &A) { for (int r = 0; r < m; ++r) { for (int c = 0; c < n; ++c) { if (A[r][c] == 1) { return {r, c}; } } } return {0, 0}; }
queue<pair<int, int>> update(vector<vector<int>> &A, int r, int c) { queue<pair<int, int>> q{{{r, c}}}, res; A[r][c] = 3; while (!q.empty()) { auto [r, c] = q.front(); q.pop(); for (int i = 0; i < 4; ++i) { int rr = r + dr[i], cc = c + dc[i]; if (isValid(rr, cc)) { if (A[rr][cc] == 1) { q.emplace(rr, cc); A[rr][cc] = 3; } else if (A[rr][cc] == 0) { res.emplace(rr, cc); A[rr][cc] = 2; } } } } return res; }
bool isValid(int r, int c) { return 0 <= r && r < m && 0 <= c && c < n; }
int m, n, dr[4] = {0, 0, 1, -1}, dc[4] = {1, -1, 0, 0}; };
|