מציאת מספר מסלולים במערך דו-ממדי

נתון מערך דו-ממדי mat המלא במספרים שלמים חיוביים ממש (ללא אפסים). יש למצוא מסלולים מהתא הראשון (שורה 0, עמודה 0) לתא האחרון (שורה אחרונה, עמודה אחרונה), המקיימים את החוק הבא:

אפשר לזוז בדיוק k צעדים מתא אחד למשנהו במערך כאשר k הוא הערך שנמצא בתא. כלומר, אם ערכו של התא mat[i][j] הוא k, אזי מהתא mat[i][j] אפשר ללכת לארבע האפשרויות הבאות (אם הן קיימות):

  1. התא mat[i+k][j]
  2. התא mat[i-k][j]
  3. התא mat[i][j+k]
  4. התא mat[i][j-k]

לדוגמה, במערך להלן סומנו שני המסלולים האפשריים.

 0123
01316
12812
26275
32413

בהינתן מערך דו-ממדי mat כנ"ל, יש להחזיר את מספר המסלולים האפשריים מהתא הראשון לתא האחרון (לפי החוק).

השיטה צריכה להיות רקורסיבית ללא שימוש בלולאות כלל. כך גם כל שיטות העזר שתכתבו (אם תכתבו) לא יכולות להכיל לולאות.

אילוצים:

מותר לשנות את המערך במהלך השיטה, אבל בסופה הוא צריך לחזור למצבו המקורי.

דוגמה 1:
קלט:
mat =
[[1, 3, 1, 6],
 [2, 8, 1, 2],
 [6, 2, 7, 5],
 [2, 4, 1, 3]]
פלט:
2

הסבר: במערך הנתון ישנם שני מסלולים אפשריים מהתא הראשון לתא האחרון.

דוגמה 2:
קלט:
mat =
[[2, 1],
 [1, 2]]
פלט:
0

הסבר: במערך זה אין מסלול מהתא הראשון לתא האחרון.

דוגמה 3:
קלט:
mat =
[[1, 1, 1],
 [1, 1, 1],
 [1, 1, 1]]
פלט:
12

הסבר: במערך זה ישנם 12 מסלולים אפשריים מהתא הראשון לתא האחרון.

דוגמה 4:
קלט:
mat =
[[3, 2, 1],
 [1, 1, 1],
 [1, 1, 1]]
פלט:
0

הסבר: במערך זה אין מסלול מהתא הראשון לתא האחרון.

דוגמה 5:
קלט:
mat =
[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]
פלט:
0

הסבר: במערך זה אין מסלול מהתא הראשון לתא האחרון.

דוגמה 6:
קלט:
mat =
[[1, 1, 1, 1],
 [1, 1, 1, 1],
 [1, 1, 1, 1],
 [1, 1, 1, 1]]
פלט:
184

הסבר: במערך זה ישנם 184 מסלולים אפשריים מהתא הראשון לתא האחרון.

דוגמה 7:
קלט:
mat = [[1]]
פלט:
1

הסבר: במערך זה ישנו מסלול אחד בלבד מהתא הראשון לתא האחרון.

דוגמה 8:
קלט:
mat =
[[2, 2],
 [2, 2]]
פלט:
0

הסבר: במערך זה אין מסלול מהתא הראשון לתא האחרון.

Loading...
נשמרLn 1, Col 1

קלט:

mat =
[[1, 3, 1, 6],
 [2, 8, 1, 2],
 [6, 2, 7, 5],
 [2, 4, 1, 3]]

הפלט המבוקש:

2