Bird
Raised Fist0
DSA Typescriptprogramming~20 mins

Rat in a Maze Problem in DSA Typescript - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Maze Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Rat's Path in a Simple Maze
What is the output path of the rat in the maze after running the given code?
DSA Typescript
function ratInMaze(maze: number[][], n: number): string[] {
  const path: string[] = [];
  function solve(x: number, y: number): boolean {
    if (x === n - 1 && y === n - 1) {
      path.push(`${x},${y}`);
      return true;
    }
    if (x >= 0 && y >= 0 && x < n && y < n && maze[x][y] === 1) {
      maze[x][y] = 0; // mark visited
      path.push(`${x},${y}`);
      if (solve(x + 1, y)) return true;
      if (solve(x, y + 1)) return true;
      path.pop();
      maze[x][y] = 1; // backtrack
    }
    return false;
  }
  solve(0, 0);
  return path;
}

const maze = [
  [1, 0, 0, 0],
  [1, 1, 0, 1],
  [0, 1, 0, 0],
  [1, 1, 1, 1]
];
console.log(ratInMaze(maze, 4));
A["0,0","1,0","1,1","1,2","2,2","3,2","3,3"]
B["0,0","1,0","1,1","2,1","3,1","3,2","3,3"]
C["0,0","1,0","2,0","3,0","3,1","3,2","3,3"]
D["0,0","0,1","1,1","2,1","3,1","3,2","3,3"]
Attempts:
2 left
💡 Hint
Trace the path by moving down first, then right, marking visited cells.
🧠 Conceptual
intermediate
1:00remaining
Understanding Rat in a Maze Movement Constraints
In the Rat in a Maze problem, which movement directions are typically allowed for the rat to find a path?
ADiagonal moves only
BUp, Down, Left, Right
CDown and Right only
DUp and Left only
Attempts:
2 left
💡 Hint
Check the common constraints in classic Rat in a Maze problems.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Maze Pathfinding Code
What error will the following TypeScript code produce when run, and why? function ratInMaze(maze: number[][], n: number): string[] { const path: string[] = []; function solve(x: number, y: number): boolean { if (x === n - 1 && y === n - 1) { path.push(`${x},${y}`); return true; } if (x >= 0 && y >= 0 && x < n && y < n && maze[x][y] === 1) { path.push(`${x},${y}`); if (solve(x + 1, y)) return true; if (solve(x, y + 1)) return true; path.pop(); } return false; } solve(0, 0); return path; } const maze = [ [1, 1], [1, 1] ]; console.log(ratInMaze(maze, 2));
ARuntime error: Cannot read property of undefined
BCorrect output: ["0,0","1,0","1,1"]
CEmpty path returned []
DStack overflow due to infinite recursion
Attempts:
2 left
💡 Hint
Check if the code marks visited cells to avoid revisiting.
🚀 Application
advanced
1:30remaining
Number of Paths in a Maze with Obstacles
Given a 3x3 maze represented as a grid where 1 is open and 0 is blocked: [[1,1,0], [1,1,1], [0,1,1]] How many unique paths exist from top-left (0,0) to bottom-right (2,2) moving only down or right?
A3
B2
C4
D1
Attempts:
2 left
💡 Hint
Count all possible routes avoiding blocked cells moving only down or right.
❓ Predict Output
expert
2:30remaining
Output of Rat in Maze with Backtracking and Multiple Paths
What is the output of the following TypeScript code that finds one path in a 4x4 maze with multiple possible routes? function ratInMaze(maze: number[][], n: number): string[] { const path: string[] = []; function solve(x: number, y: number): boolean { if (x === n - 1 && y === n - 1) { path.push(`${x},${y}`); return true; } if (x >= 0 && y >= 0 && x < n && y < n && maze[x][y] === 1) { maze[x][y] = 0; // mark visited path.push(`${x},${y}`); if (solve(x, y + 1)) return true; if (solve(x + 1, y)) return true; path.pop(); maze[x][y] = 1; // backtrack } return false; } solve(0, 0); return path; } const maze = [ [1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1] ]; console.log(ratInMaze(maze, 4));
A["0,0","0,1","1,1","1,2","2,2","2,3","3,3"]
B["0,0","1,0","1,1","2,1","2,2","3,2","3,3"]
C["0,0","0,1","0,2","1,2","2,2","3,2","3,3"]
D["0,0","0,1","1,1","2,1","3,1","3,2","3,3"]
Attempts:
2 left
💡 Hint
The code tries moving right first, then down.

Practice

(1/5)
1. What is the main goal of the Rat in a Maze Problem in data structures and algorithms?
easy
A. Sort the cells of the maze in ascending order
B. Count the number of walls in the maze
C. Calculate the shortest distance between two points in a graph
D. Find a path from the start to the destination in a maze

Solution

  1. Step 1: Understand the problem context

    The Rat in a Maze problem involves navigating through a maze represented as a grid to find a path from the start cell to the destination cell.
  2. Step 2: Identify the goal

    The goal is to find a valid path that the rat can follow to reach the destination without crossing walls or blocked cells.
  3. Final Answer:

    Find a path from the start to the destination in a maze -> Option D
  4. Quick Check:

    Goal = Find path [OK]
Hint: Remember: Rat must find a path, not count or sort cells [OK]
Common Mistakes:
  • Confusing path finding with counting walls
  • Thinking the problem is about sorting cells
  • Assuming shortest path is always required
2. Which of the following is the correct TypeScript syntax to declare a 2D maze array of size 4x4 filled with zeros?
easy
A. const maze: number[][] = Array.from({length: 4}, () => Array(4).fill(0));
B. const maze: number[][] = [[0]*4]*4;
C. const maze: number[][] = new Array(4, 4).fill(0);
D. const maze: number[][] = Array(4).fill(Array(4).fill(0));

Solution

  1. Step 1: Understand array initialization in TypeScript

    Using Array.from with a mapping function creates independent inner arrays, avoiding reference issues.
  2. Step 2: Analyze each option

    const maze: number[][] = Array(4).fill(Array(4).fill(0)); creates inner arrays by reference, causing all rows to point to the same array. const maze: number[][] = Array.from({length: 4}, () => Array(4).fill(0)); correctly creates separate arrays for each row. Options B and C use invalid syntax for 2D arrays.
  3. Final Answer:

    const maze: number[][] = Array.from({length: 4}, () => Array(4).fill(0)); -> Option A
  4. Quick Check:

    Correct 2D array init = const maze: number[][] = Array.from({length: 4}, () => Array(4).fill(0)); [OK]
Hint: Use Array.from with a function to avoid shared references [OK]
Common Mistakes:
  • Using fill with nested arrays causing shared references
  • Incorrect syntax for 2D array creation
  • Confusing array size parameters
3. Given the following maze and code snippet, what will be the output?
const maze = [
  [1, 0, 0, 0],
  [1, 1, 0, 1],
  [0, 1, 0, 0],
  [1, 1, 1, 1]
];

function isSafe(x: number, y: number): boolean {
  return x >= 0 && y >= 0 && x < 4 && y < 4 && maze[x][y] === 1;
}

function solveMaze(x: number, y: number, path: string[]): boolean {
  if (x === 3 && y === 3) {
    path.push(`(${x},${y})`);
    return true;
  }
  if (isSafe(x, y)) {
    path.push(`(${x},${y})`);
    if (solveMaze(x + 1, y, path)) return true;
    if (solveMaze(x, y + 1, path)) return true;
    path.pop();
  }
  return false;
}

const path: string[] = [];
if (solveMaze(0, 0, path)) {
  console.log(path.join(' -> '));
} else {
  console.log('No path found');
}
medium
A. (0,0) -> (0,1) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3)
B. (0,0) -> (1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3)
C. No path found
D. (0,0) -> (1,0) -> (2,0) -> (3,0) -> (3,1) -> (3,2) -> (3,3)

Solution

  1. Step 1: Trace the recursive path from (0,0)

    Starting at (0,0), the rat moves down to (1,0) since maze[1][0] = 1. Then right to (1,1), down to (2,1), down to (3,1), right to (3,2), and right to (3,3).
  2. Step 2: Verify path validity and output

    All these cells are safe (value 1). The path is recorded and printed as shown in (0,0) -> (1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3).
  3. Final Answer:

    (0,0) -> (1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) -> Option B
  4. Quick Check:

    Path found = (0,0) -> (1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) [OK]
Hint: Follow down then right moves recursively to find path [OK]
Common Mistakes:
  • Assuming movement to blocked cells (0 values)
  • Confusing row and column indices
  • Ignoring backtracking when path fails
4. Identify the bug in the following TypeScript code snippet for the Rat in a Maze problem:
function solveMaze(x: number, y: number, path: string[]): boolean {
  if (x === 3 && y === 3) {
    path.push(`(${x},${y})`);
    return true;
  }
  if (isSafe(x, y)) {
    path.push(`(${x},${y})`);
    if (solveMaze(x + 1, y, path)) return true;
    if (solveMaze(x, y + 1, path)) return true;
    path.pop();
  }
  return false;
}
medium
A. isSafe function is not called before pushing to path
B. Incorrect base case coordinates for destination
C. Missing backtracking step to remove current cell from path when dead end is reached
D. The function should move left and up instead of right and down

Solution

  1. Step 1: Analyze the recursion and path tracking

    The function adds the current cell to path but does not remove it if both recursive calls fail, causing incorrect path accumulation.
  2. Step 2: Identify missing backtracking

    Backtracking requires removing the current cell from path when no path forward is found, which is missing here.
  3. Final Answer:

    Missing backtracking step to remove current cell from path when dead end is reached -> Option C
  4. Quick Check:

    Backtracking needed = Missing backtracking step to remove current cell from path when dead end is reached [OK]
Hint: Always pop path on dead ends to backtrack [OK]
Common Mistakes:
  • Forgetting to remove cell from path on failure
  • Incorrect base case coordinates
  • Ignoring isSafe checks before path push
5. You want to modify the Rat in a Maze algorithm to find all possible paths from start (0,0) to destination (N-1,N-1) in an NxN maze. Which approach should you use?
hard
A. Use backtracking to explore all safe moves, storing each complete path separately
B. Stop at the first found path and return immediately
C. Use a greedy approach to always move right or down only
D. Convert the maze to a graph and use Dijkstra's algorithm to find shortest path

Solution

  1. Step 1: Understand the requirement to find all paths

    Finding all paths requires exploring every possible route without stopping at the first success.
  2. Step 2: Choose backtracking to explore all safe moves

    Backtracking allows exploring all safe moves recursively, storing each complete path separately before backtracking to try other routes.
  3. Final Answer:

    Use backtracking to explore all safe moves, storing each complete path separately -> Option A
  4. Quick Check:

    All paths = Backtracking exploration [OK]
Hint: Backtrack fully to find all paths, not just one [OK]
Common Mistakes:
  • Stopping after first path found
  • Using greedy moves that miss paths
  • Using shortest path algorithms instead of all paths
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard