Untitled
unknown
c_cpp
23 days ago
2.1 kB
3
Indexable
class Solution { public: int shortestDistance(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); vector<vector<int>> dist(m, vector<int>(n, 0)); vector<vector<int>> reach(m, vector<int>(n, 0)); int total_buildings = 0; // 找到所有的建築物,並從每個建築物 BFS for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 1) { total_buildings++; bfs(grid, i, j, dist, reach); } } } int minDist = INT_MAX; // 找到空地,同時被所有建築物 reach 的最小距離 for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 0 && reach[i][j] == total_buildings) { minDist = min(minDist, dist[i][j]); } } } return minDist == INT_MAX ? -1 : minDist; } void bfs(vector<vector<int>>& grid, int row, int col, vector<vector<int>>& dist, vector<vector<int>>& reach) { int m = grid.size(), n = grid[0].size(); queue<pair<int, int>> q; q.push({row, col}); vector<vector<bool>> visited(m, vector<bool>(n, false)); visited[row][col] = true; int level = 1; vector<pair<int, int>> dirs = {{0,1}, {1,0}, {-1,0}, {0,-1}}; while (!q.empty()) { int size = q.size(); while (size--) { auto [r, c] = q.front(); q.pop(); for (auto [dr, dc] : dirs) { int nr = r + dr, nc = c + dc; if (nr >= 0 && nr < m && nc >= 0 && nc < n && !visited[nr][nc] && grid[nr][nc] == 0) { visited[nr][nc] = true; dist[nr][nc] += level; reach[nr][nc]++; q.push({nr, nc}); } } } level++; } } };
Editor is loading...
Leave a Comment