mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2026-03-13 08:51:02 +08:00
Add Unique Paths problem with backtracking and DP solutions.
This commit is contained in:
58
src/algorithms/uncategorized/unique-paths/btUniquePaths.js
Normal file
58
src/algorithms/uncategorized/unique-paths/btUniquePaths.js
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* BACKTRACKING approach of solving Unique Paths problem.
|
||||
*
|
||||
* @param {number} width - Width of the board.
|
||||
* @param {number} height - Height of the board.
|
||||
* @param {number[][]} steps - The steps that have been already made.
|
||||
* @param {number} uniqueSteps - Total number of unique steps.
|
||||
* @return {number} - Number of unique paths.
|
||||
*/
|
||||
export default function btUniquePaths(width, height, steps = [[0, 0]], uniqueSteps = 0) {
|
||||
// Fetch current position on board.
|
||||
const currentPos = steps[steps.length - 1];
|
||||
|
||||
// Check if we've reached the end.
|
||||
if (currentPos[0] === width - 1 && currentPos[1] === height - 1) {
|
||||
// In case if we've reached the end let's increase total
|
||||
// number of unique steps.
|
||||
return uniqueSteps + 1;
|
||||
}
|
||||
|
||||
// Let's calculate how many unique path we will have
|
||||
// by going right and by going down.
|
||||
let rightUniqueSteps = 0;
|
||||
let downUniqueSteps = 0;
|
||||
|
||||
// Do right step if possible.
|
||||
if (currentPos[0] < width - 1) {
|
||||
steps.push([
|
||||
currentPos[0] + 1,
|
||||
currentPos[1],
|
||||
]);
|
||||
|
||||
// Calculate how many unique paths we'll get by moving right.
|
||||
rightUniqueSteps = btUniquePaths(width, height, steps, uniqueSteps);
|
||||
|
||||
// BACKTRACK and try another move.
|
||||
steps.pop();
|
||||
}
|
||||
|
||||
// Do down step if possible.
|
||||
if (currentPos[1] < height - 1) {
|
||||
steps.push([
|
||||
currentPos[0],
|
||||
currentPos[1] + 1,
|
||||
]);
|
||||
|
||||
// Calculate how many unique paths we'll get by moving down.
|
||||
downUniqueSteps = btUniquePaths(width, height, steps, uniqueSteps);
|
||||
|
||||
// BACKTRACK and try another move.
|
||||
steps.pop();
|
||||
}
|
||||
|
||||
// Total amount of unique steps will be equal to total amount of
|
||||
// unique steps by going right plus total amount of unique steps
|
||||
// by going down.
|
||||
return rightUniqueSteps + downUniqueSteps;
|
||||
}
|
||||
Reference in New Issue
Block a user