function solve({maze, point = [0, 0], safest, path = []} = {}) {
const [r, c] = point;
if (!safest) safest = Array.from({length: maze.length}).map(() => new Array(maze[0].length));
let risk = 0;
if (safest[r][c]) {
risk = safest[r][c];
}
else if (r === maze.length - 1 && c === maze[0].length - 1) {
risk = safest[r][c] = maze[r][c];
}
else if (r === maze.length - 1) {
risk = safest[r][c] = maze[r][c] + solve({maze, point: [r, c + 1], safest, path}).risk;
}
else if (c === maze[0].length - 1) {
risk = safest[r][c] = maze[r][c] + solve({maze, point: [r + 1, c], safest, path}).risk;
}
else {
const right = solve({maze, point: [r, c + 1], safest, path});
const down = solve({maze, point: [r + 1, c], safest, path});
risk = safest[r][c] = Math.min(right.risk, down.risk)
+ ((r === 0 && c === 0) ? 0 : maze[r][c])
;
}
return {risk, safest, path};
}