Et matrixsandsynlighedsspørgsmål

Givet en rektangulær matrix kan vi bevæge os fra den nuværende celle i 4 retninger med lige sandsynlighed. De 4 retninger er højre venstre øverste eller bund. Beregn sandsynligheden for, at vi efter N bevæger sig fra en given position (i J) i matrixen, vil vi ikke krydse grænserne for matrixen på noget tidspunkt.

Vi anbefaler dig kraftigt at minimere din browser og prøve dette selv først.

Ideen er at udføre noget, der ligner DFS. Vi gennemgår rekursivt i hver af de 4 tilladte retning, og for hver celle, der er stødt på, beregner vi den krævede sandsynlighed med et mindre træk. Da hver retning har lige sandsynlighed, vil hver retning bidrage til 1/4 af den samlede sandsynlighed for den celle, dvs. 0,25. Vi returnerer 0, hvis vi træder uden for matrixen og returnerer 1, hvis n trin er afsluttet uden at krydse matrixgrænser.

Nedenfor er implementeringen af ​​ovenstående idé: 

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>   

Produktion
Probability is 0.875