Related Articles

# A matrix probability question

• Difficulty Level : Medium
• Last Updated : 27 Apr, 2021

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 :

## C++

 `/// C++ program to find the probability``// that we do not cross boundary of a``// matrix after N moves.``#include ``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;``}`

## Java

 `// 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.`

## Python3

 `# 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`

## C#

 `// 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.`

## PHP

 `= 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.``?>`

## Javascript

 ``

Output :

`Probability is 0.875`