מילה במסלול עם פניה אחת

נתון מערך דו-ממדי board המכיל תווים שהם אותיות ה-abc הקטנות בלבד.

כמו כן נתונה מחרוזת תווים word המכילה מילה.

אנחנו מעוניינים לבדוק אם ניתן להרכיב את המילה word במסלול במערך board בהתאם לכללים הבאים:

  • המסלול מתחיל בתא שבו נמצאת האות הראשונה של המילה.
  • בכל צעד ניתן לזוז לאחד מארבעת הכיוונים: למעלה, למטה, שמאלה או ימינה.
  • לאורך כל המסלול מותר לבצע לכל היותר שינוי כיוון אחד בלבד.
  • אין לבקר באותו תא פעמיים.

לדוגמה:

אם המערך הדו-ממדי board הוא זה:

 01234
0xsubo
1thher
2eacje
3dliaa
4mocvd
5abnak

את המחרוזות "java" ו-"shalom" אפשר להרכיב לפי תנאי המסלולים. (המסלולים מסומנים במערך)

את המחרוזות "bread" ו-"teacher" אי אפשר להרכיב לפי תנאי המסלולים. במחרוזת "bread" (שמתחילה באות 'b' שנמצאת במקום board[0][3]) אי אפשר לעבור מ-'b' ל-'r' כי זה באלכסון, ובמחרוזת "teacher" (שמתחילה באות 't' שנמצאת במקום board[1][0]) יש יותר מפניה אחת.

בהינתן המערך הדו-ממדי board מלא באותיות לטיניות קטנות בלבד, ומחרוזת תווים word, יש להחזיר true אם אפשר להרכיב את word כמסלול במערך board לפי התנאים, ו-false אחרת.

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

אילוצים:
  • המערך מכיל אותיות קטנות בלבד (abc) וגם במחרוזת יש אותיות קטנות בלבד.
  • המערך מלא בנתונים חוקיים ואינו null.
  • במהלך הפתרון אין להשתמש במערכי עזר או במבני נתונים נוספים.
  • מותר לשנות את המערך בתוך השיטה, אבל הוא צריך לחזור למצבו המקורי בסיומה.
  • מתוך השיטות של המחלקה String מותר להשתמש אך ורק בשיטות charAt ו-length.
דוגמה 1:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "java"
פלט:
true

הסבר: המחרוזת "java" ניתנת להרכבה במערך: j נמצאת ב-(2,3), a ב-(3,3), v ב-(4,3), a ב-(5,2). המסלול תקין - כל מעבר הוא בכיוון אחד (למטה, למטה, שמאלה) עם שינוי כיוון אחד בלבד.

דוגמה 2:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "shalom"
פלט:
true

הסבר: המחרוזת "shalom" ניתנת להרכבה במערך: s ב-(0,1), h ב-(1,1), a ב-(2,1), l ב-(3,1), o ב-(4,1), m ב-(4,0). המסלול הולך למטה ואז שמאלה - שינוי כיוון אחד בלבד.

דוגמה 3:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "bread"
פלט:
false

הסבר: המחרוזת "bread" מתחילה באות 'b' שנמצאת במקום (0,3). אבל כדי להמשיך ל-'r' צריך ללכת באלכסון, וזה אסור לפי הכללים.

דוגמה 4:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "teacher"
פלט:
false

הסבר: המחרוזת "teacher" מתחילה באות 't' שנמצאת במקום (1,0). כדי להמשיך ל-'e' נלך למטה ל-(2,0), ואז ל-'a' ב-(2,1) ימינה - אבל זה כבר שינוי כיוון שני, ויש יותר מפניה אחת בסה"כ.

דוגמה 5:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "her"
פלט:
true

הסבר: המחרוזת "her" מתחילה ב-'h' ב-(1,2), ואז 'e' ב-(1,3) ימינה, ואז 'r' ב-(1,4) ימינה - כיוון אחד בלבד, ללא שינוי כיוון.

דוגמה 6:
קלט:
board =
[['a', 'b'],
 ['c', 'd']],
word = "abc"
פלט:
false

הסבר: המחרוזת "abc" - מתחילה ב-'a' ב-(2,1), ואז 'b' ב-(5,1)? המרחק גדול מדי. אין מסלול רציף תקין עם לכל היותר שינוי כיוון אחד.

דוגמה 7:
קלט:
board =
[['a', 'b'],
 ['c', 'd']],
word = "ab"
פלט:
true

הסבר: המחרוזת "ab" מתחילה ב-'a' ב-(0,0), ואז 'b' ב-(0,1) ימינה - כיוון אחד בלבד, תקין.

דוגמה 8:
קלט:
board =
[['a', 'b'],
 ['c', 'd']],
word = "abd"
פלט:
true

הסבר: המחרוזת "abd" - 'a' ב-(0,0), 'b' ב-(0,1) ימינה, 'd' ב-(1,1) למטה - שינוי כיוון אחד, תקין.

דוגמה 9:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "x"
פלט:
true

הסבר: המחרוזת "x" היא תו בודד שנמצא ב-(0,0). מסלול באורך 1 תמיד תקין.

דוגמה 10:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "zzz"
פלט:
false

הסבר: המחרוזת "zzz" לא קיימת במערך כלל - האות 'z' לא מופיעה.

דוגמה 11:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "ore"
פלט:
true

הסבר: המחרוזת "ore" - 'o' ב-(4,1), 'r' אין שכן 'r'. ננסה 'o' ב-(0,4), ואז... אין מסלול תקין עם לכל היותר פניה אחת.

דוגמה 12:
קלט:
board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "dlmo"
פלט:
false

הסבר: המחרוזת "dlmo" - 'd' ב-(3,0), 'l' ב-(3,1) ימינה... אין 'm' שכן ל-'l'. ננסה 'd' ב-(4,4), אין מסלול. ננסה מסלול אחר: 'd' ב-(3,0), למטה ל-'m' ב-(4,0), 'l' לא שכן. לא תקין.

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

קלט:

board =
[['x', 's', 'u', 'b', 'o'],
 ['t', 'h', 'h', 'e', 'r'],
 ['e', 'a', 'c', 'j', 'e'],
 ['d', 'l', 'i', 'a', 'a'],
 ['m', 'o', 'c', 'v', 'd'],
 ['a', 'b', 'n', 'a', 'k']],
word = "java"

הפלט המבוקש:

true