class Solution {
public:
class compare {
public:
bool operator() (const vector<int>& a, const vector<int>& b) {
return a[2] < b[2];
}
};
int shortestDistance(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) {
int row = static_cast<int>(maze.size());
int col = static_cast<int>(maze[0].size());
const vector<vector<int>> neigh{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
vector<vector<int>> distance(row, vector<int>(col, INT_MAX));
distance[start[0]][start[1]] = 0;
// use Dijkstra's with min-value oriented priority queue, each element should be [x, y, distance], distance as the key
priority_queue<vector<int>, vector<vector<int>>, compare> pq;
pq.push({start[0], start[1], 0});
while (!pq.empty()) {
auto node = pq.top();
pq.pop();
if (distance[node[0]][node[1]] < node[2]) {
continue;
}
for (const auto & dir: neigh) {
int x = node[0] + dir[0];
int y = node[1] + dir[1];
int steps = 0;
while (x >= 0 && x < row
&& y >= 0 && y < col
&& maze[x][y] == 0) {
steps++;
x += dir[0];
y += dir[1];
}
if (distance[x-dir[0]][y-dir[1]] > distance[node[0]][node[1]] + steps) {
distance[x-dir[0]][y-dir[1]] = node[2] + steps;
pq.push({x-dir[0], y-dir[1], distance[x-dir[0]][y-dir[1]]});
}
}
}