A matrix probability question

Given a rectangular matrix, we can move from current cell in 4 directions with equal probability. The 4 directions are right, left, top or bottom. Calculate the Probability that after N moves from a given position (i, j) in the matrix, we will not cross boundaries of the matrix at any point.

We strongly recommend you to minimize your browser and try this yourself first.

The idea is to perform something similar to DFS. We recursively traverse in each of the 4 allowed direction and for each cell encountered, we calculate the required probability with one less move. As each direction has equal probability, each direction will contribute to 1/4 of total probability of that cell i.e. 0.25. We return 0 if we step outside the matrix and return 1 if N steps are completed without crossing matrix boundaries.



Below is the implementation of above idea :

filter_none

edit
close

play_arrow

link
brightness_4
code

/// C++ program to find the probability 
// that we do not cross boundary of a 
// matrix after N moves.
#include <iostream>
using namespace std;
  
// check if (x, y) is valid matrix coordinate
bool isSafe(int x, int y, int m, int n)
{
    return (x >= 0 && x < m && 
            y >= 0 && y < n);
}
  
// Function to calculate probability 
// that after N moves from a given 
// position (x, y) in m x n matrix, 
// boundaries of the matrix will not be crossed.
double findProbability(int m, int n, int x, 
                       int y, int N)
{
    // boundary crossed
    if (!isSafe(x, y, m, n))
        return 0.0;
  
    // N steps taken
    if (N == 0)
        return 1.0;
  
    // Initialize result
    double prob = 0.0;
  
    // move up
    prob += findProbability(m, n, x - 1, 
                            y, N - 1) * 0.25;
  
    // move right
    prob += findProbability(m, n, x, 
                            y + 1, N - 1) * 0.25;
  
    // move down
    prob += findProbability(m, n, x + 1,
                            y, N - 1) * 0.25;
  
    // move left
    prob += findProbability(m, n, x, 
                            y - 1, N - 1) * 0.25;
  
    return prob;
}
  
// Driver code
int main()
{
    // matrix size
    int m = 5, n = 5;
  
    // coordinates of starting point
    int i = 1, j = 1;
  
    // Number of steps
    int N = 2;
  
    cout << "Probability is "
        << findProbability(m, n, i, j, N);
  
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the probability
// that we do not cross boundary
// of a matrix after N moves.
import java.io.*;
  
class GFG {
      
// check if (x, y) is valid
// matrix coordinate
static boolean isSafe(int x, int y, 
                      int m, int n)
{
    return (x >= 0 && x < m && 
            y >= 0 && y < n);
}
  
// Function to calculate probability
// that after N moves from a given
// position (x, y) in m x n matrix,
// boundaries of the matrix will 
// not be crossed.
static double findProbability(int m, int n, 
                              int x, int y, 
                              int N)
{
      
    // boundary crossed
    if (! isSafe(x, y, m, n))
        return 0.0;
  
    // N steps taken
    if (N == 0)
        return 1.0;
  
    // Initialize result
    double prob = 0.0;
  
    // move up
    prob += findProbability(m, n, x - 1
                            y, N - 1) * 0.25;
  
    // move right
    prob += findProbability(m, n, x, y + 1,
                            N - 1) * 0.25;
  
    // move down
    prob += findProbability(m, n, x + 1
                            y, N - 1) * 0.25;
  
    // move left
    prob += findProbability(m, n, x, y - 1,
                            N - 1) * 0.25;
  
    return prob;
}
  
// Driver code
public static void main (String[] args)
{
    // matrix size
    int m = 5, n = 5;
  
    // coordinates of starting point
    int i = 1, j = 1;
  
    // Number of steps
    int N = 2;
  
    System.out.println("Probability is "
                       findProbability(m, n, i,
                       j, N));
  
}
  
}
  
// This code is contributed by KRV.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the probability 
# that we do not cross boundary of a 
# matrix after N moves. 
  
# check if (x, y) is valid matrix coordinate 
def isSafe(x, y, m, n):
    return (x >= 0 and x < m and
            y >= 0 and y < n)
  
# Function to calculate probability 
# that after N moves from a given 
# position (x, y) in m x n matrix, 
# boundaries of the matrix will 
# not be crossed. 
def findProbability(m, n, x, y, N):
      
    # boundary crossed 
    if (not isSafe(x, y, m, n)): 
        return 0.0
  
    # N steps taken 
    if (N == 0): 
        return 1.0
  
    # Initialize result 
    prob = 0.0
  
    # move up 
    prob += findProbability(m, n, x - 1
                            y, N - 1) * 0.25
  
    # move right 
    prob += findProbability(m, n, x, 
                            y + 1, N - 1) * 0.25
  
    # move down 
    prob += findProbability(m, n, x + 1,
                            y, N - 1) * 0.25
  
    # move left 
    prob += findProbability(m, n, x, 
                            y - 1, N - 1) * 0.25
  
    return prob
  
# Driver code 
if __name__ == '__main__':
  
    # matrix size 
    m = 5
    n = 5
  
    # coordinates of starting po
    i = 1
    j = 1
  
    # Number of steps 
    N = 2
  
    print("Probability is"
           findProbability(m, n, i, j, N))
  
# This code is contributed by PranchalK
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the probability
// that we do not cross boundary
// of a matrix after N moves.
using System;
  
class GFG 
{
      
// check if (x, y) is valid
// matrix coordinate
static bool isSafe(int x, int y, 
                   int m, int n)
{
    return (x >= 0 && x < m && 
            y >= 0 && y < n);
}
  
// Function to calculate probability
// that after N moves from a given
// position (x, y) in m x n matrix,
// boundaries of the matrix will 
// not be crossed.
static double findProbability(int m, int n, 
                              int x, int y, 
                              int N)
{
      
    // boundary crossed
    if (! isSafe(x, y, m, n))
        return 0.0;
  
    // N steps taken
    if (N == 0)
        return 1.0;
  
    // Initialize result
    double prob = 0.0;
  
    // move up
    prob += findProbability(m, n, x - 1, 
                            y, N - 1) * 0.25;
  
    // move right
    prob += findProbability(m, n, x, y + 1,
                            N - 1) * 0.25;
  
    // move down
    prob += findProbability(m, n, x + 1, 
                            y, N - 1) * 0.25;
  
    // move left
    prob += findProbability(m, n, x, y - 1,
                            N - 1) * 0.25;
  
    return prob;
}
  
// Driver code
public static void Main ()
{
    // matrix size
    int m = 5, n = 5;
  
    // coordinates of starting point
    int i = 1, j = 1;
  
    // Number of steps
    int N = 2;
  
    Console.Write("Probability is "
                   findProbability(m, n, i,
                   j, N));
  
}
  
}
  
// This code is contributed by nitin mittal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find the probability 
// that we do not cross boundary of a 
// matrix after N moves.
  
// check if (x, y) is valid
// matrix coordinate
function isSafe($x, $y, $m, $n)
{
    return ($x >= 0 && $x < $m && 
            $y >= 0 && $y < $n);
}
  
// Function to calculate probability 
// that after N moves from a given 
// position (x, y) in m x n matrix, 
// boundaries of the matrix will 
// not be crossed.
function findProbability($m, $n, $x
                         $y, $N)
{
    // boundary crossed
    if (!isSafe($x, $y, $m, $n))
        return 0.0;
  
    // N steps taken
    if ($N == 0)
        return 1.0;
  
    // Initialize result
    $prob = 0.0;
  
    // move up
    $prob += findProbability($m, $n, $x - 1, 
                             $y, $N - 1) * 0.25;
  
    // move right
    $prob += findProbability($m, $n, $x
                             $y + 1, $N - 1) * 0.25;
  
    // move down
    $prob += findProbability($m, $n, $x + 1,
                             $y, $N - 1) * 0.25;
  
    // move left
    $prob += findProbability($m, $n, $x
                             $y - 1, $N - 1) * 0.25;
  
    return $prob;
}
  
// Driver code
  
// matrix size
$m = 5; $n = 5;
  
// coordinates of starting point
$i = 1; $j = 1;
  
// Number of steps
$N = 2;
  
echo "Probability is "
      findProbability($m, $n, $i, $j, $N);
  
// This code is contributed by nitin mittal. 
?>
chevron_right


Output :
Probability is 0.875

This article is contributed by Aditya Goel. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above




Improved By : KRV, nitin mittal, PranchalKatiyar



Article Tags :
Practice Tags :