Thursday, July 4, 2024
HomeData ModellingDynamic ProgrammingCount number of ways to reach destination in a Maze

Count number of ways to reach destination in a Maze

Given a maze with obstacles, count the number of paths to reach the rightmost-bottommost cell from the topmost-leftmost cell. A cell in the given maze has a value of -1 if it is a blockage or dead-end, else 0.

From a given cell, we are allowed to move to cells (i+1, j) and (i, j+1) only.

Examples: 

Input: maze[R][C] =  {{0,  0, 0, 0},
{0, -1, 0, 0},
{-1, 0, 0, 0},
{0, 0, 0, 0}};
Output: 4
There are four possible paths as shown in
below diagram.

Recommended Practice

Recursion:
When considering the cell (0,0) as the starting point, there is actually 1 way to reach it, which is by not making any move at all. This understanding helps us establish the base case for our recursive solution.

By observing the recursion tree, we can notice that there is repetition in the function calls. This is a common occurrence when multiple recursive calls are made.

We can have confidence in the recursive function’s ability to provide the number of unique paths from an intermediate point to the destination.

Since we can only move downward or to the right, we pass these options to the recursive function, trusting that it will determine the answer by traversing from these points to the destination.

By summing up the number of unique ways from the downward and rightward paths, we obtain the total number of unique ways.

C++




#include <bits/stdc++.h>
using namespace std;
 
long long int MOD = 1e9 + 7;
 
// Helper function to calculate the number of unique paths
long long int
helper(long long int m, long long int n,
       vector<vector<long long int> >& obstacleGrid)
{
    // Base cases
    if (m < 0 || n < 0) {
        return 0;
    }
 
    if (obstacleGrid[m][n] == -1) {
        return 0;
    }
 
    if (m == 0 && n == 0) {
        return 1;
    }
 
    // Recursively calculate the number of unique paths by
    // considering downward and rightward movements
    return (helper(m - 1, n, obstacleGrid) % MOD
            + helper(m, n - 1, obstacleGrid) % MOD)
           % MOD;
}
 
// Function to calculate the number of unique paths with
// obstacles
long long int uniquePathsWithObstacles(
    vector<vector<long long int> >& obstacleGrid)
{
    long long int m = obstacleGrid.size();
    long long int n = obstacleGrid[0].size();
 
    return helper(m - 1, n - 1, obstacleGrid);
}
 
int main()
{
    // Example obstacle grid
    vector<vector<long long int> > grid
        = { { 0, 0, 0, 0 },
            { 0, -1, 0, 0 },
            { -1, 0, 0, 0 },
            { 0, 0, 0, 0 } };
 
    // Calculate and print the number of unique paths with
    // obstacles
    cout << uniquePathsWithObstacles(grid);
 
    return 0;
}


Java




import java.util.*;
 
public class UniquePathsObstacles {
    static long MOD = 1000000007;
 
    // Helper function to calculate the number of unique paths
    static long helper(int m, int n, int[][] obstacleGrid) {
        // Base cases
        if (m < 0 || n < 0) {
            return 0;
        }
 
        if (obstacleGrid[m][n] == -1) {
            return 0;
        }
 
        if (m == 0 && n == 0) {
            return 1;
        }
 
        // Recursively calculate the number of unique paths by
        // considering downward and rightward movements
        return (helper(m - 1, n, obstacleGrid) % MOD
                + helper(m, n - 1, obstacleGrid) % MOD)
               % MOD;
    }
 
    // Function to calculate the number of unique paths with obstacles
    static long uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
 
        return helper(m - 1, n - 1, obstacleGrid);
    }
 
    public static void main(String[] args) {
        // Example obstacle grid
        int[][] grid = { { 0, 0, 0, 0 },
                         { 0, -1, 0, 0 },
                         { -1, 0, 0, 0 },
                         { 0, 0, 0, 0 } };
 
        // Calculate and print the number of unique paths with obstacles
        System.out.println(uniquePathsWithObstacles(grid));
    }
}


Python3




MOD = 10**9 + 7
 
# Helper function to calculate the number of unique paths
def helper(m, n, obstacleGrid):
    # Base cases
    if m < 0 or n < 0:
        return 0
 
    if obstacleGrid[m][n] == -1:
        return 0
 
    if m == 0 and n == 0:
        return 1
 
    # Recursively calculate the number of unique paths by
    # considering downward and rightward movements
    return (helper(m - 1, n, obstacleGrid) % MOD
            + helper(m, n - 1, obstacleGrid) % MOD) % MOD
 
# Function to calculate the number of unique paths with obstacles
def uniquePathsWithObstacles(obstacleGrid):
    m = len(obstacleGrid)
    n = len(obstacleGrid[0])
 
    return helper(m - 1, n - 1, obstacleGrid)
 
if __name__ == "__main__":
    # Example obstacle grid
    grid = [
        [0, 0, 0, 0],
        [0, -1, 0, 0],
        [-1, 0, 0, 0],
        [0, 0, 0, 0]
    ]
 
    # Calculate and print the number of unique paths with obstacles
    print(uniquePathsWithObstacles(grid))


C#




using System;
 
class Program
{
    static long MOD = 1000000007; // Define the modulo constant
 
    // Helper function to calculate the number of unique paths
    static long Helper(int m, int n, long[][] obstacleGrid)
    {
        // Base cases
        if (m < 0 || n < 0)
            return 0;
 
        if (obstacleGrid[m][n] == -1)
            return 0;
 
        if (m == 0 && n == 0)
            return 1;
 
        // Recursively calculate the number of unique paths by
        // considering downward and rightward movements
        return (Helper(m - 1, n, obstacleGrid) % MOD
                + Helper(m, n - 1, obstacleGrid) % MOD)
               % MOD;
    }
 
    // Function to calculate the number of unique paths with obstacles
    static long UniquePathsWithObstacles(long[][] obstacleGrid)
    {
        int m = obstacleGrid.Length;
        int n = obstacleGrid[0].Length;
 
        return Helper(m - 1, n - 1, obstacleGrid);
    }
 
    static void Main()
    {
        // Example obstacle grid
        long[][] grid =
        {
            new long[] {0, 0, 0, 0},
            new long[] {0, -1, 0, 0},
            new long[] {-1, 0, 0, 0},
            new long[] {0, 0, 0, 0}
        };
 
        // Calculate and print the number of unique paths with obstacles
        Console.WriteLine(UniquePathsWithObstacles(grid));
    }
}


Javascript




// JavaScript Program for the above approach
const MOD = 1000000007;
 
// Helper function to calculate the number of unique paths
function helper(m, n, obstacleGrid) {
    // Base cases
    if (m < 0 || n < 0) {
        return 0;
    }
 
    if (obstacleGrid[m][n] === -1) {
        return 0;
    }
 
    if (m === 0 && n === 0) {
        return 1;
    }
 
    // Recursively calculate the number of unique paths by considering downward and rightward movements
    return (helper(m - 1, n, obstacleGrid) % MOD + helper(m, n - 1, obstacleGrid) % MOD) % MOD;
}
 
// Function to calculate the number of unique paths with obstacles
function uniquePathsWithObstacles(obstacleGrid) {
    const m = obstacleGrid.length;
    const n = obstacleGrid[0].length;
 
    return helper(m - 1, n - 1, obstacleGrid);
}
 
// Example usage
const grid = [
    [0, 0, 0, 0],
    [0, -1, 0, 0],
    [-1, 0, 0, 0],
    [0, 0, 0, 0],
];
 
// Calculate and print the number of unique paths with obstacles
console.log(uniquePathsWithObstacles(grid));
// This code is contributed by Kanchan Agarwal


Output

4






Time Complexity:O(2 n * m)

Space Complexity:O(n*m)

Memoization:

We can cache the overlapping subproblems to make it a efficient solution

C++




#include <bits/stdc++.h>
using namespace std;
 
long long int MOD = 1e9 + 7;
 
// Helper function to calculate the number of unique paths
long long int
helper(long long int m, long long int n,
       vector<vector<long long int> >& dp,
       vector<vector<long long int> >& obstacleGrid)
{
    // Base case: If out of bounds or obstacle, return 0
    if (m < 0 || n < 0 || obstacleGrid[m][n] == -1) {
        return 0;
    }
 
    // Base case: If at the destination, return 1
    if (m == 0 && n == 0) {
        return 1;
    }
 
    // If already calculated, return the stored value
    if (dp[m][n] != -1) {
        return dp[m][n];
    }
 
    // Calculate the number of unique paths by moving down
    // and right
    dp[m][n] = (helper(m - 1, n, dp, obstacleGrid) % MOD
                + helper(m, n - 1, dp, obstacleGrid) % MOD)
               % MOD;
 
    return dp[m][n];
}
 
// Function to calculate the number of unique paths with
// obstacles
long long int uniquePathsWithObstacles(
    vector<vector<long long int> >& obstacleGrid)
{
    long long int m = obstacleGrid.size();
    long long int n = obstacleGrid[0].size();
 
    // Create a 2D DP matrix to store the calculated values
    vector<vector<long long int> > dp(
        m, vector<long long int>(n, -1));
 
    // Call the helper function to calculate the number of
    // unique paths
    return helper(m - 1, n - 1, dp, obstacleGrid);
}
 
int main()
{
    // Example obstacle grid
    vector<vector<long long int> > grid
        = { { 0, 0, 0, 0 },
            { 0, -1, 0, 0 },
            { -1, 0, 0, 0 },
            { 0, 0, 0, 0 } };
 
    // Calculate the number of unique paths with obstacles
    cout << uniquePathsWithObstacles(grid);
 
    return 0;
}


Output

4






Time Complexity:O(n*m) 

Space Complexity:O(n*m)

Tabulation:

Intuition:

  1. We declare a 2-D matrix of size matrix[n+1][m+1]
  2. We fill the matrix with -1 where the blocked cells we given.
  3. Then we traverse through the matrix and put the sum of matrix[i-1][j] and matrix[i][j-1] if there doesn’t exist a -1.
  4. Atlast we return the matrix[n][m] as our ans

Implementation:

C++




#include <iostream>
#include <vector>
using namespace std;
 
int FindWays(int n, int m, vector<vector<int>>& blockedCell) {
    int mod = 1000000007;
    vector<vector<int>> matrix(n + 1, vector<int>(m + 1, 0));
 
    for (int i = 0; i < blockedCell.size(); i++) {
        matrix[blockedCell[i][0]][blockedCell[i][1]] = -1;
    }
 
    for (int i = 0; i <= n; i++) {
        if (matrix[i][1] != -1)
            matrix[i][1] = 1;
    }
    for (int j = 0; j <= m; j++) {
        if (matrix[1][j] != -1)
            matrix[1][j] = 1;
    }
 
    for (int i = 2; i <= n; i++) {
        for (int j = 2; j <= m; j++) {
            if (matrix[i][j] == -1) {
                continue;
            }
            if (matrix[i - 1][j] != -1 && matrix[i][j - 1] != -1) {
                matrix[i][j] = (matrix[i - 1][j] + matrix[i][j - 1]) % mod;
            } else if (matrix[i - 1][j] != -1) {
                matrix[i][j] = matrix[i - 1][j];
            } else if (matrix[i][j - 1] != -1) {
                matrix[i][j] = matrix[i][j - 1];
            } else {
                matrix[i][j] = -1;
            }
        }
    }
 
    if (matrix[n][m] < 0) {
        return 0;
    } else {
        return matrix[n][m];
    }
}
 
int main() {
    int n = 3, m = 3;
    vector<vector<int>> blocked_cells = { { 1, 2 }, { 3, 2 } };
    cout << FindWays(n, m, blocked_cells) << endl;
    return 0;
}


Java




// Java program to count number of paths in a maze
// with obstacles.
 
import java.io.*;
 
class GFG {
    public static int FindWays(int n, int m,
                               int[][] blockedCell)
    {
        int mod = 1000000007;
        int matrix[][] = new int[n + 1][m + 1];
 
        for (int i = 0; i < blockedCell.length; i++) {
            matrix[blockedCell[i][0]][blockedCell[i][1]]
                = -1;
        }
 
        for (int i = 0; i <= n; i++) {
            if (matrix[i][1] != -1)
                matrix[i][1] = 1;
        }
        for (int j = 0; j <= m; j++) {
            if (matrix[1][j] != -1)
                matrix[0][1] = 1;
        }
 
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (matrix[i][j] == -1) {
                    continue;
                }
                if (matrix[i - 1][j] != -1
                    && matrix[i][j - 1] != -1) {
                    matrix[i][j] = (matrix[i - 1][j]
                                    + matrix[i][j - 1])
                                   % mod;
                }
                else if (matrix[i - 1][j] != -1) {
                    matrix[i][j] = matrix[i - 1][j];
                }
                else if (matrix[i][j - 1] != -1) {
                    matrix[i][j] = matrix[i][j - 1];
                }
                else {
                    matrix[i][j] = -1;
                }
            }
        }
 
        if (matrix[n][m] < 0) {
            return 0;
        }
        else {
            return matrix[n][m];
        }
    }
    public static void main(String[] args)
    {
        int n = 3, m = 3;
        int[][] blocked_cells = { { 1, 2 }, { 3, 2 } };
        System.out.println(FindWays(n, m, blocked_cells));
    }
}
// This code is contributed by Raunak Singh


Output

1






Time Complexity: O(N*M)
Space Complexity: O(N*M) Since we are using a 2-D matrix

This problem is an extension of the below problem.

Backtracking | Set 2 (Rat in a Maze)

In this post, a different solution is discussed that can be used to solve the above Rat in a Maze problem also.
The idea is to modify the given grid[][] so that grid[i][j] contains count of paths to reach (i, j) from (0, 0) if (i, j) is not a blockage, else grid[i][j] remains -1. 

We can recursively compute grid[i][j] using below 
formula and finally return grid[R-1][C-1]
// If current cell is a blockage
if (maze[i][j] == -1)
maze[i][j] = -1; // Do not change
// If we can reach maze[i][j] from maze[i-1][j]
// then increment count.
else if (maze[i-1][j] > 0)
maze[i][j] = (maze[i][j] + maze[i-1][j]);
// If we can reach maze[i][j] from maze[i][j-1]
// then increment count.
else if (maze[i][j-1] > 0)
maze[i][j] = (maze[i][j] + maze[i][j-1]);

Below is the implementation of the above idea. 

C++




// C++ program to count number of paths in a maze
// with obstacles.
#include<bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
 
// Returns count of possible paths in a maze[R][C]
// from (0,0) to (R-1,C-1)
int countPaths(int maze[][C])
{
    // If the initial cell is blocked, there is no
    // way of moving anywhere
    if (maze[0][0]==-1)
        return 0;
 
    // Initializing the leftmost column
    for (int i=0; i<R; i++)
    {
        if (maze[i][0] == 0)
            maze[i][0] = 1;
 
        // If we encounter a blocked cell in leftmost
        // row, there is no way of visiting any cell
        // directly below it.
        else
            break;
    }
 
    // Similarly initialize the topmost row
    for (int i=1; i<C; i++)
    {
        if (maze[0][i] == 0)
            maze[0][i] = 1;
 
        // If we encounter a blocked cell in bottommost
        // row, there is no way of visiting any cell
        // directly below it.
        else
            break;
    }
 
    // The only difference is that if a cell is -1,
    // simply ignore it else recursively compute
    // count value maze[i][j]
    for (int i=1; i<R; i++)
    {
        for (int j=1; j<C; j++)
        {
            // If blockage is found, ignore this cell
            if (maze[i][j] == -1)
                continue;
 
            // If we can reach maze[i][j] from maze[i-1][j]
            // then increment count.
            if (maze[i-1][j] > 0)
                maze[i][j] = (maze[i][j] + maze[i-1][j]);
 
            // If we can reach maze[i][j] from maze[i][j-1]
            // then increment count.
            if (maze[i][j-1] > 0)
                maze[i][j] = (maze[i][j] + maze[i][j-1]);
        }
    }
 
    // If the final cell is blocked, output 0, otherwise
    // the answer
    return (maze[R-1][C-1] > 0)? maze[R-1][C-1] : 0;
}
 
// Driver code
int main()
{
    int maze[R][C] =  {{0,  0, 0, 0},
                       {0, -1, 0, 0},
                       {-1, 0, 0, 0},
                       {0,  0, 0, 0}};
    cout << countPaths(maze);
    return 0;
}


Java




// Java program to count number of paths in a maze
// with obstacles.
import java.io.*;
 
class GFG
{
    static int R = 4;
    static int C = 4;
     
    // Returns count of possible paths in
    // a maze[R][C] from (0,0) to (R-1,C-1)
    static int countPaths(int maze[][])
    {
        // If the initial cell is blocked,
        // there is no way of moving anywhere
        if (maze[0][0]==-1)
            return 0;
     
        // Initializing the leftmost column
        for (int i = 0; i < R; i++)
        {
            if (maze[i][0] == 0)
                maze[i][0] = 1;
     
            // If we encounter a blocked cell
            // in leftmost row, there is no way
            // of visiting any cell directly below it.
            else
                break;
        }
     
        // Similarly initialize the topmost row
        for (int i =1 ; i< C ; i++)
        {
            if (maze[0][i] == 0)
                maze[0][i] = 1;
     
            // If we encounter a blocked cell in
            // bottommost row, there is no way of
            // visiting any cell directly below it.
            else
                break;
        }
     
        // The only difference is that if a cell
        // is -1, simply ignore it else recursively
        // compute count value maze[i][j]
        for (int i = 1; i < R; i++)
        {
            for (int j = 1; j <C ; j++)
            {
                // If blockage is found,
                // ignore this cell
                if (maze[i][j] == -1)
                    continue;
     
                // If we can reach maze[i][j] from
                // maze[i-1][j] then increment count.
                if (maze[i - 1][j] > 0)
                    maze[i][j] = (maze[i][j] +
                                 maze[i - 1][j]);
     
                // If we can reach maze[i][j] from
                //  maze[i][j-1] then increment count.
                if (maze[i][j - 1] > 0)
                    maze[i][j] = (maze[i][j] +
                                  maze[i][j - 1]);
            }
        }
     
        // If the final cell is blocked,
        // output 0, otherwise the answer
        return (maze[R - 1][C - 1] > 0) ?
                maze[R - 1][C - 1] : 0;
    }
     
    // Driver code
 
    public static void main (String[] args)
    {
        int maze[][] = {{0, 0, 0, 0},
                       {0, -1, 0, 0},
                       {-1, 0, 0, 0},
                       {0, 0, 0, 0}};
        System.out.println (countPaths(maze));
     
    }
 
}
 
// This code is contributed by vt_m


Python3




# Python 3 program to count number of paths
# in a maze with obstacles.
 
R = 4
C = 4
 
# Returns count of possible paths in a
# maze[R][C] from (0,0) to (R-1,C-1)
def countPaths(maze):
     
    # If the initial cell is blocked,
    # there is no way of moving anywhere
    if (maze[0][0] == -1):
        return 0
 
    # Initializing the leftmost column
    for i in range(R):
        if (maze[i][0] == 0):
            maze[i][0] = 1
 
        # If we encounter a blocked cell in
        # leftmost row, there is no way of
        # visiting any cell directly below it.
        else:
            break
 
    # Similarly initialize the topmost row
    for i in range(1, C, 1):
        if (maze[0][i] == 0):
            maze[0][i] = 1
 
        # If we encounter a blocked cell in
        # bottommost row, there is no way of
        # visiting any cell directly below it.
        else:
            break
 
    # The only difference is that if a cell is -1,
    # simply ignore it else recursively compute
    # count value maze[i][j]
    for i in range(1, R, 1):
        for j in range(1, C, 1):
             
            # If blockage is found, ignore this cell
            if (maze[i][j] == -1):
                continue
 
            # If we can reach maze[i][j] from
            # maze[i-1][j] then increment count.
            if (maze[i - 1][j] > 0):
                maze[i][j] = (maze[i][j] +
                              maze[i - 1][j])
 
            # If we can reach maze[i][j] from
            # maze[i][j-1] then increment count.
            if (maze[i][j - 1] > 0):
                maze[i][j] = (maze[i][j] +
                              maze[i][j - 1])
 
    # If the final cell is blocked,
    # output 0, otherwise the answer
    if (maze[R - 1][C - 1] > 0):
        return maze[R - 1][C - 1]
    else:
        return 0
 
# Driver code
if __name__ == '__main__':
    maze = [[0, 0, 0, 0],
            [0, -1, 0, 0],
            [-1, 0, 0, 0],
            [0, 0, 0, 0 ]]
    print(countPaths(maze))
 
# This code is contributed by
# Surendra_Gangwar


C#




// C# program to count number of paths in a maze
// with obstacles.
using System;
 
class GFG {
     
    static int R = 4;
    static int C = 4;
     
    // Returns count of possible paths in
    // a maze[R][C] from (0,0) to (R-1,C-1)
    static int countPaths(int [,]maze)
    {
         
        // If the initial cell is blocked,
        // there is no way of moving anywhere
        if (maze[0,0]==-1)
            return 0;
     
        // Initializing the leftmost column
        for (int i = 0; i < R; i++)
        {
            if (maze[i,0] == 0)
                maze[i,0] = 1;
     
            // If we encounter a blocked cell
            // in leftmost row, there is no way
            // of visiting any cell directly below it.
            else
                break;
        }
     
        // Similarly initialize the topmost row
        for (int i =1 ; i< C ; i++)
        {
            if (maze[0,i] == 0)
                maze[0,i] = 1;
     
            // If we encounter a blocked cell in
            // bottommost row, there is no way of
            // visiting any cell directly below it.
            else
                break;
        }
     
        // The only difference is that if a cell
        // is -1, simply ignore it else recursively
        // compute count value maze[i][j]
        for (int i = 1; i < R; i++)
        {
            for (int j = 1; j <C ; j++)
            {
                // If blockage is found,
                // ignore this cell
                if (maze[i,j] == -1)
                    continue;
     
                // If we can reach maze[i][j] from
                // maze[i-1][j] then increment count.
                if (maze[i - 1,j] > 0)
                    maze[i,j] = (maze[i,j] +
                                maze[i - 1,j]);
     
                // If we can reach maze[i][j] from
                // maze[i][j-1] then increment count.
                if (maze[i,j - 1] > 0)
                    maze[i,j] = (maze[i,j] +
                                maze[i,j - 1]);
            }
        }
     
        // If the final cell is blocked,
        // output 0, otherwise the answer
        return (maze[R - 1,C - 1] > 0) ?
                maze[R - 1,C - 1] : 0;
    }
     
    // Driver code
    public static void Main ()
    {
        int [,]maze = { {0, 0, 0, 0},
                        {0, -1, 0, 0},
                        {-1, 0, 0, 0},
                        {0, 0, 0, 0}};
                         
        Console.Write (countPaths(maze));
    }
 
}
 
// This code is contributed by nitin mittal.


Javascript




<script>
 
// JavaScript program to count number
// of paths in a maze with obstacles.
let R = 4;
let C = 4;
   
// Returns count of possible paths in
// a maze[R][C] from (0,0) to (R-1,C-1)
function countPaths(maze)
{
     
    // If the initial cell is blocked,
    // there is no way of moving anywhere
    if (maze[0][0] == -1)
        return 0;
   
    // Initializing the leftmost column
    for(let i = 0; i < R; i++)
    {
        if (maze[i][0] == 0)
            maze[i][0] = 1;
   
        // If we encounter a blocked cell
        // in leftmost row, there is no way
        // of visiting any cell directly below it.
        else
            break;
    }
   
    // Similarly initialize the topmost row
    for(let i = 1; i < C; i++)
    {
        if (maze[0][i] == 0)
            maze[0][i] = 1;
   
        // If we encounter a blocked cell in
        // bottommost row, there is no way of
        // visiting any cell directly below it.
        else
            break;
    }
   
    // The only difference is that if a cell
    // is -1, simply ignore it else recursively
    // compute count value maze[i][j]
    for(let i = 1; i < R; i++)
    {
        for(let j = 1; j < C; j++)
        {
             
            // If blockage is found,
            // ignore this cell
            if (maze[i][j] == -1)
                continue;
   
            // If we can reach maze[i][j] from
            // maze[i-1][j] then increment count.
            if (maze[i - 1][j] > 0)
                maze[i][j] = (maze[i][j] +
                              maze[i - 1][j]);
   
            // If we can reach maze[i][j] from
            //  maze[i][j-1] then increment count.
            if (maze[i][j - 1] > 0)
                maze[i][j] = (maze[i][j] +
                              maze[i][j - 1]);
        }
    }
   
    // If the final cell is blocked,
    // output 0, otherwise the answer
    return (maze[R - 1][C - 1] > 0) ?
            maze[R - 1][C - 1] : 0;
}
 
// Driver Code
let maze = [ [ 0, 0, 0, 0 ],
             [ 0, -1, 0, 0 ],
             [ -1, 0, 0, 0 ],
             [ 0, 0, 0, 0 ] ];
                
document.write(countPaths(maze));
 
// This code is contributed by code_hunt
 
</script>


PHP




<?php
// PHP program to count number
// of paths in a maze with obstacles.
 
$R = 4;
$C = 4;
 
// Returns count of possible
// paths in a maze[R][C]
// from (0,0) to (R-1,C-1)
function countPaths( $maze)
{
    global $R, $C;
     
    // If the initial cell is
    // blocked, there is no
    // way of moving anywhere
    if ($maze[0][0] == - 1)
        return 0;
 
    // Initializing the
    // leftmost column
    for ( $i = 0; $i < $R; $i++)
    {
        if ($maze[$i][0] == 0)
            $maze[$i][0] = 1;
 
        // If we encounter a blocked
        // cell in leftmost row,
        // there is no way of
        // visiting any cell
        // directly below it.
        else
            break;
    }
 
    // Similarly initialize
    // the topmost row
    for($i = 1; $i < $C; $i++)
    {
        if ($maze[0][$i] == 0)
            $maze[0][$i] = 1;
 
        // If we encounter a blocked
        // cell in bottommost row,
        // there is no way of
        // visiting any cell
        // directly below it.
        else
            break;
    }
 
    // The only difference is
    // that if a cell is -1,
    // simply ignore it else
    // recursively compute
    // count value maze[i][j]
    for($i = 1; $i < $R; $i++)
    {
        for($j = 1; $j < $C; $j++)
        {
             
            // If blockage is found,
            // ignore this cell
            if ($maze[$i][$j] == -1)
                continue;
 
            // If we can reach maze[i][j]
            // from maze[i-1][j]
            // then increment count.
            if ($maze[$i - 1][$j] > 0)
                $maze[$i][$j] = ($maze[$i][$j] +
                           $maze[$i - 1][$j]);
 
            // If we can reach maze[i][j]
            // from maze[i][j-1]
            // then increment count.
            if ($maze[$i][$j - 1] > 0)
                $maze[$i][$j] = ($maze[$i][$j] +
                             $maze[$i][$j - 1]);
        }
    }
 
    // If the final cell is
    // blocked, output 0,
    // otherwise the answer
    return ($maze[$R - 1][$C - 1] > 0) ?
            $maze[$R - 1][$C - 1] : 0;
}
 
    // Driver Code
    $maze = array(array(0, 0, 0, 0),
                  array(0, -1, 0, 0),
                  array(-1, 0, 0, 0),
                  array(0, 0, 0, 0));
    echo countPaths($maze);
 
// This code is contributed by anuj_67.
?>


Output

4






Time Complexity: O(R x C)
Auxiliary Space: O(1)

This article is contributed by Roshni Agarwal. If you like neveropen and would like to contribute, you can also write an article using write.neveropen.co.za or mail your article to review-team@neveropen.co.za. See your article appearing on the neveropen main page and help other Geeks. 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Dominic Rubhabha Wardslaus
Dominic Rubhabha Wardslaushttps://neveropen.dev
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments