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++ 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;
} |
// 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 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# 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 // 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. ?> |
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
Recommended Posts:
- Minimum steps required to convert the matrix into lower hessenberg matrix
- Minimum number of steps to convert a given matrix into Diagonally Dominant Matrix
- Minimum number of steps to convert a given matrix into Upper Hessenberg matrix
- Check if matrix can be converted to another matrix by transposing square sub-matrices
- Circular Matrix (Construct a matrix with numbers 1 to m*n in spiral way)
- Program to check diagonal matrix and scalar matrix
- Find the probability of a state at a given time in a Markov chain | Set 1
- Finding the probability of a state at a given time in a Markov chain | Set 2
- Find probability of selecting element from kth column after N iterations
- Check if it is possible to make the given matrix increasing matrix or not
- C++ program to Convert a Matrix to Sparse Matrix
- Program to convert given Matrix to a Diagonal Matrix
- Convert given Matrix into sorted Spiral Matrix
- Count frequency of k in a matrix of size n where matrix(i, j) = i+j
- Program to check if a matrix is Binary matrix or not