ホームページ  >  記事  >  バックエンド開発  >  行列の確率の問題?

行列の確率の問題?

WBOY
WBOY転載
2023-08-28 20:37:06948ブラウズ

行列の確率の問題?

ここでは、行列の確率の問題を見ていきます。長方形の行列があります。現在のセルから 4 つの方向に等しい確率で移動できます。 4 方向とは、左、右、上、下です。位置 M[i,j] から開始して N 回移動した後の確率を計算したいとします。

ここでは、DFS に関連する作業をいくつか行う必要があります。現在の部屋から開始して、考えられる 4 つの部屋を再帰的に調べます。次に、歩数が 1 つ少なくなる確率を計算します。 4 つの方向の確率は等しいため、各方向は合計確率の 0.25 に寄与します。マトリックスの境界を越えた場合は 0 を返し、N 個の移動が完了した場合は 1 を返します。このアイデアを得るアルゴリズムを見てみましょう。

アルゴリズム

matProb(m, n, x, y, N)

Begin
   if x,y is not in matrix boundary m, n, then return 0
   if N is 0 , then return 1
   prob := 0
   prob := prob + matProb(m, n, x-1, y, N-1) * 0.25
   prob := prob + matProb(m, n, x+1, y, N-1) * 0.25
   prob := prob + matProb(m, n, x, y+1, N-1) * 0.25
   prob := prob + matProb(m, n, x, y-1, N-1) * 0.25
   return prob
End

#include<iostream>
using namespace std;
bool isSafe(int x, int y, int m, int n) { //function to check whether (x,y)
   is in matrix or not
   if(x >= 0 && x < m && y >= 0 && y < n){
      return true;
   }
   return false;
}
double matProb(int m, int n, int x, int y, int N) {
   if (!isSafe(x, y, m, n)) //if coundary is crossed
      return 0.0;
   if (N == 0) //when N is 0, or N is completed, return 1
      return 1.0;
   double probability = 0.0;
   probability += matProb(m, n, x - 1, y, N - 1) * 0.25; //move left
   probability += matProb(m, n, x, y + 1, N - 1) * 0.25; //move up
   probability += matProb(m, n, x + 1, y, N - 1) * 0.25; //move right
   probability += matProb(m, n, x, y - 1, N - 1) * 0.25; //move down
   return probability;
}
int main() {
   int m = 7, n = 8;
   int x = 1, y = 1;
   int N = 4;
   cout << "Matrix Probability is " << matProb(m, n, x, y, N);
}

出力

Matrix Probability is 0.664062

以上が行列の確率の問題?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。