Een matrixkansvraag

Gegeven een rechthoekige matrix kunnen we met gelijke waarschijnlijkheid in 4 richtingen van de huidige cel gaan. De 4 aanwijzingen zijn rechts links of onderkant. Bereken de waarschijnlijkheid dat na n van een bepaalde positie (i j) in de matrix beweegt, we op geen enkel moment grenzen van de matrix overschrijden.

We raden u ten zeerste aan om uw browser te minimaliseren en dit eerst zelf te proberen.

Het idee is om iets vergelijkbaars uit te voeren met DFS. We doorkruisen recursief in elk van de 4 toegestane richting en voor elke aangetroffen cel berekenen we de vereiste waarschijnlijkheid met één beweging minder. Aangezien elke richting gelijke waarschijnlijkheid heeft, zal elke richting bijdragen aan 1/4 van de totale waarschijnlijkheid van die cel, d.w.z. 0,25. We retourneren 0 Als we buiten de matrix stappen en 1 retourneren als n stappen zijn voltooid zonder matrixgrenzen te overschrijden.

Hieronder is de implementatie van bovenstaande idee: 

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>   

Uitvoer
Probability is 0.875