-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathminimum-time-to-visit-a-cell-in-a-grid.cpp
42 lines (40 loc) · 1.77 KB
/
minimum-time-to-visit-a-cell-in-a-grid.cpp
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
// Time: O(m * n * log(m * n))
// Space: O(m * n)
// dijkstra's algorithm
class Solution {
public:
int minimumTime(vector<vector<int>>& grid) {
static const vector<pair<int, int>> DIRECTIONS = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
if (min(grid[0][1], grid[1][0]) > 1) {
return -1;
}
const auto& dijkstra = [&](const pair<int, int>& start, const pair<int, int>& target) {
vector<vector<int>> best(size(grid), vector<int>(size(grid[0]), numeric_limits<int>::max()));
best[start.first][start.second] = 0;
using Data = tuple<int, int, int>;
priority_queue<Data, vector<Data>, greater<Data>> min_heap;
min_heap.emplace(0, start.first, start.second);
while (!empty(min_heap)) {
const auto [curr, i, j] = min_heap.top(); min_heap.pop();
if (best[i][j] < curr) {
continue;
}
if (pair(i, j) == target) {
break;
}
for (const auto& [di, dj] : DIRECTIONS) {
const auto ni = i + di, nj = j + dj;
if (!(0 <= ni && ni < size(grid) &&
0 <= nj && nj < size(grid[0]) &&
best[ni][nj] > max(grid[ni][nj] + static_cast<int>(grid[ni][nj] % 2 == curr % 2), curr + 1))) {
continue;
}
best[ni][nj] = max(grid[ni][nj] + static_cast<int>(grid[ni][nj] % 2 == curr % 2), curr + 1);
min_heap.emplace(best[ni][nj], ni, nj);
}
}
return best[target.first][target.second];
};
return dijkstra(pair(0, 0), pair(size(grid) - 1, size(grid[0]) - 1));
}
};