מציאת מסלול הנחש הקצר ביותר

נתון מערך דו-ממדי mat בגודל n x m שערכיו הם מספרים שלמים חיוביים ממש.

נגדיר מסלול-נחש (snake-path) במערך אם הוא מקיים את התנאים הבאים:

  1. המסלול מתחיל בתא הראשון במערך - שורה ראשונה ועמודה ראשונה.
  2. המסלול מסתיים בתא האחרון במערך - שורה אחרונה ועמודה אחרונה.
  3. אפשר לעבור מתא אחד לשני רק אם הוא שכן שלו באלכסון, לא בשום תא אחר.
  4. אפשר לעבור מתא לתא רק אם ההפרש בין הערכים שנמצאים בשני התאים הוא לכל היותר 1. למשל, מתא שערכו הוא 4 אפשר ללכת לתא שערכו הוא 3 או 4 או 5.
  5. המסלול לא יכול לחזור לתא בו הוא היה כבר!

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

אם אין מסלול יוחזר  -1.

לדוגמא, במערך להלן מסומן מסלול-נחש באורך מינימלי - 5:

 01234
045671
135174
245678
334579
432276

השיטה צריכה להיות יעילה ככל הניתן, גם מבחינת סיבוכיות הזמן וגם מבחינת סיבוכיות המקום.

אילוצים:

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

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

הסבר: המסלול הקצר ביותר עובר דרך: (4,4)→(3,3)→(2,2)→(1,1)→(0,0) עם ערכים 6→7→6→5→4

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

הסבר: המסלול: (1,1)→(0,0) עם ערכים 2→1

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

הסבר: המסלול: (1,1)→(0,0) עם ערכים 1→1

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

הסבר: המסלול האלכסוני הראשי עם הפרשים של 0 בין כל צמד תאים סמוכים באלכסון

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

הסבר: מערך עם תא אחד - המסלול כולל רק את התא הזה

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

הסבר: ההפרש בין 3 ל-1 גדול מ-1, אז לא קיים מסלול שמתאים לתנאי הבעיה

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

הסבר: ההפרש בין 10 ל-1 גדול מ-1, אז לא קיים מסלול שמתאים לתנאי הבעיה

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

הסבר: המסלול האלכסוני הראשי עם הפרשים של 0 בין כל צמד תאים סמוכים באלכסון

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

קלט:

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

הפלט המבוקש:

5