Unique Paths III
HardArrayBacktrackingBit ManipulationMatrix
Solution
import { range } from '@algorithm/lib';
export function uniquePathsIII(grid: number[][]): number {
const [n, m] = [grid.length, grid[0].length];
const directions = [
[0, 1],
[1, 0],
[0, -1],
[-1, 0],
];
const dfs = (y: number, x: number, empty: number) => {
if (y < 0 || n <= y || x < 0 || m <= x || grid[y][x] === -1) {
return 0;
}
if (grid[y][x] === 2) {
return empty === -1 ? 1 : 0;
}
let ret = 0;
grid[y][x] = -1;
for (const [dy, dx] of directions) {
ret += dfs(y + dy, x + dx, empty - 1);
}
grid[y][x] = 0;
return ret;
};
let [sy, sx, empty] = [0, 0, 0];
for (const y of range(n)) {
for (const x of range(m)) {
if (grid[y][x] === 1) {
[sy, sx] = [y, x];
} else if (grid[y][x] === 0) {
empty += 1;
}
}
}
return dfs(sy, sx, empty);
}