Otázka pravděpodobnosti matice
Vzhledem k obdélníkové matici se můžeme pohybovat ze současných buněk ve 4 směrech se stejnou pravděpodobností. 4 směry jsou vpravo vlevo nebo dole. Vypočítejte pravděpodobnost, že po přesunutí z dané polohy (I j) v matici v žádném okamžiku nepřekračujeme hranice matice.
Důrazně doporučujeme, abyste minimalizovali váš prohlížeč a nejprve to zkuste sami.
Cílem je provádět něco podobného jako DFS. Rekurzivně procházíme v každém ze 4 povolených směrů a pro každou setkání buňky vypočítáme požadovanou pravděpodobnost s jedním menším pohybem. Protože každý směr má stejnou pravděpodobnost, že každý směr přispěje k 1/4 celkové pravděpodobnosti této buňky, tj. 0,25. Vrátíme se 0, pokud vystoupíme mimo matici a vrátíme se 1, pokud jsou N kroky dokončeny bez překročení hranic matice.
Níže je uvedena implementace výše uvedené myšlenky:
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 ; }
C /// C program to find the probability // that we do not cross boundary of a // matrix after N moves. #include #include // 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 ; printf ( 'Probability is %f' findProbability ( m n i j N )); return 0 ; } // This code is contributed by kothavvsaakash.
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 // 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. ?>
JavaScript < script > // JavaScript 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 let 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 let m = 5 n = 5 ; // coordinates of starting point let i = 1 j = 1 ; // Number of steps let N = 2 ; document . write ( 'Probability is ' + findProbability ( m n i j N )); < /script>
Výstup
Probability is 0.875