在这里,我们将看到一个矩阵概率问题。我们有一个矩形矩阵。我们可以以相等的概率从当前单元格向四个方向移动。这四个方向分别是左,右,上和下。我们必须计算N从位置M [i,j]移动之后的概率。
在这里,我们将做一些与DFS相关的事情。我们将从当前房间中依次遍历四个可能的房间中的每个房间。然后,我们将少一步计算出概率。由于四个方向中的每个方向具有相等的概率,因此每个方向将贡献总概率的0.25。如果我们越过矩阵边界,我们将返回0,并且在完成N次移动后将返回1。让我们看一下获得想法的算法。
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