여기서 우리는 하나의 행렬 확률 문제를 볼 것입니다. 하나의 직사각형 행렬이 있습니다. 동일한 확률로 현재 셀에서 4방향으로 이동할 수 있습니다. 이 4가지 방향은 왼쪽, 오른쪽, 위, 아래입니다. N이 위치 M[i, j]에서 이동한 후 확률을 계산해야 합니다.
여기서는 DFS와 관련된 작업을 수행합니다. 우리는 현재 방에서 가능한 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