9. Shortest path - BFS
Input: grid = [[0,1],[1,0]]
Output: 2
Input: grid = [[0,0,0],[1,1,0],[1,1,0]]
Output: 4
Last updated
Input: grid = [[0,1],[1,0]]
Output: 2
Input: grid = [[0,0,0],[1,1,0],[1,1,0]]
Output: 4
Last updated
Input: grid = [[1,0,0],[1,1,0],[1,1,0]]
Output: -1
/**
* @param {number[][]} grid
* @return {number}
*/
var shortestPathBinaryMatrix = function (grid) {
const visited = new Array(grid.length);
for (let i = 0; i < grid.length; i++) {
visited[i] = new Array(grid[0].length).fill(0);
}
const q = [[1, 0, 0]];
visited[0][0] = true;
// const sets = [];
while (q.length !== 0) {
// console.log(q);
const [step, row, col] = q.shift();
if (grid[row][col] === 1)
break;
// console.log(row, col);
if (row === grid.length - 1 && col === grid[0].length - 1) {
// sets.push([step]);
return step;
}
const nextNodes = findNextNodesToVisit(grid, row, col, visited, step);
q.push(...nextNodes);
}
return -1;
// console.log(sets);
// return sets.length === 0 ? -1 : Math.max(...sets);
};
const directions = [
[-1, -1], [0, -1], [1, -1],
[-1, 0], [0, 0], [1, 0],
[-1, 1], [0, 1], [1, 1]
]
function findNextNodesToVisit(m, row, col, visited, step) {
const nextNodes = [];
for (const [x, y] of directions) {
const nextRow = row + x;
const nextCol = col + y;
if (!isValidNode(m, nextRow, nextCol)) continue;
if (visited[nextRow][nextCol]) continue;
visited[nextRow][nextCol] = true;
if (m[nextRow][nextCol] === 1) continue;
nextNodes.push([step + 1, nextRow, nextCol]);
}
return nextNodes;
}
function isValidNode(m, row, col) {
return 0 <= row && row < m.length && 0 <= col && col < m[0].length;
}