317. Shortest Distance from All Buildings

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) {
                    //auto curr = grid;    //use one more int inside the queue instead of another matrix to store curr steps
                    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;
    }
};

results matching ""

    No results matching ""