class Solution {
public:
int shortestDistance(vector<vector<int>>& grid) {
int m = grid.size();
int n = m ? grid[0].size() : 0;
int buildings = 0;
auto total = grid;
vector<int> dir = {0, 1, 0, -1, 0};
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == 1) {
queue<vector<int>> visit;
visit.push({i, j, 0});
while (!visit.empty()) {
auto tmp = visit.front();
for (int k = 0; k < 4; k++) {
int I = tmp[0] + dir[k];
int J = tmp[1] + dir[k + 1];
if (I < 0 || J < 0 || I >= m || J >= n || grid[I][J] != buildings)
continue;
grid[I][J]--;
total[I][J] += tmp[2] + 1;
visit.push({I, J, tmp[2] + 1});
}
visit.pop();
}
buildings--;
}
int res = INT_MAX;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == buildings && res > total[i][j])
res = total[i][j];
if (res == INT_MAX) res = -1;
return res;
}
};