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
| class Solution { public: int shortestDistance(vector<vector<int>>& grid) { if (grid.empty() || grid[0].empty()) return -1; int m = grid.size(), n = grid[0].size(); vector<vector<int>> s(m, vector<int>(n)), cnt = s; int color = 0; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 1) { bfs(s, grid, cnt, --color, i, j, m, n); } } } int res = INT_MAX; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (s[i][j] > 0 && cnt[i][j] + color == 0) { res = min(res, s[i][j]); } } } return res == INT_MAX ? -1 : res; }
void bfs(vector<vector<int>> &s, vector<vector<int>> &grid, vector<vector<int>> &cnt, int color, int i, int j, int m, int n) { queue<pair<int, int>> q; q.emplace(i, j); int d = 1; while (!q.empty()) { for (int k = q.size(); k > 0; --k) { auto u = q.front(); q.pop(); for (int p = 0; p < 4; ++p) { int vi = u.first + di[p]; int vj = u.second + dj[p]; if (0 <= vi && vi < m && 0 <= vj && vj < n && color < grid[vi][vj] && grid[vi][vj] < 1) { grid[vi][vj] = color; s[vi][vj] += d; q.emplace(vi, vj); ++cnt[vi][vj]; } } } ++d; } }
int di[4] = {1, -1, 0, 0}, dj[4] = {0, 0, 1, -1}; };
|