1
// 980. Unique Paths III2
var uniquePathsIII = function (grid) {3
const M = grid.length; // grid height4
const N = grid[0].length; // grid width5
let result = 0; // final result7
startX = 0; // starting point coordinates9
finalX = 0; // endpoint coordinates10
let empty = 0; // count of empty squares11
let visit = Array(M); // visited squares (MxN of booleans)13
// Initialization of required variables14
for (let i = 0; i < M; i++) {15
visit[i] = Array(N).fill(false); // now: "visit[i][j] === false"16
for (let j = 0; j < N; j++) {33
// Recursively run DFS and get the answer in the "result" variable34
dfs(startY, startX, visit, 0);38
function dfs(startY, startX, visit, step) {39
// If it's a wrong square, then exit immediately42
startY >= M || // off grid (height)44
startX >= N || // off grid (width)45
visit[startY][startX] || // already processed46
grid[startY][startX] === -1 // this is an obstacle48
return; // ... exit now50
// Base case: we're at the endpoint, need to stop the recursion.51
// If all of squares are visited, increase the "result":52
// (count of paths from start to the end).53
if (startY === finalY && startX === finalX) {54
if (step - 1 === empty) result++;58
// Run DFS for neighboring squares.59
// Increase the number of steps (count of the visited squares).60
visit[startY][startX] = true; // mark current square as visited61
dfs(startY - 1, startX, visit, step + 1); // top62
dfs(startY, startX + 1, visit, step + 1); // right63
dfs(startY + 1, startX, visit, step + 1); // bottom64
dfs(startY, startX - 1, visit, step + 1); // left65
visit[startY][startX] = false; // restore visited square