ที่นี่เราจะเห็นปัญหาความน่าจะเป็นของเมทริกซ์หนึ่งปัญหา เรามีเมทริกซ์สี่เหลี่ยมหนึ่งอัน เราสามารถย้ายสี่ทิศทางจากเซลล์ปัจจุบันด้วยความน่าจะเป็นเท่ากัน ทิศทั้งสี่นี้ คือ ซ้าย ขวา ขึ้นและลง เราต้องคำนวณความน่าจะเป็นหลังจาก N เคลื่อนจากตำแหน่ง M[i, j]
ที่นี่เราจะทำสิ่งที่เกี่ยวข้องกับ DFS เราจะสำรวจแบบวนซ้ำในแต่ละห้องที่เป็นไปได้สี่ห้องจากห้องปัจจุบัน จากนั้นเราจะคำนวณความน่าจะเป็นด้วยการเคลื่อนไหวที่น้อยลง เนื่องจากแต่ละทิศทางในสี่ทิศทางมีความน่าจะเป็นเท่ากัน ดังนั้นแต่ละทิศทางจะมีส่วน 0.25 ของความน่าจะเป็นทั้งหมด ถ้าเราข้ามขอบเขตของเมทริกซ์ เราจะคืนค่า 0 และ 1 จะถูกส่งกลับเมื่อการย้าย N เสร็จสิ้น ให้เราดูอัลกอริทึมเพื่อให้ได้แนวคิด
อัลกอริทึม
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