תכנות
—
שיעור 95
1/October/2009
מלכות על לוח שחמט
המשכנו בבעיה שהוצגה
בשעור קודם
.
כפי שראינו, הפתרונות עבור צריחים שאינם "מאימים" אחד על השני מיוצגים בדיוק על ידי כל התמורות.
חלק מהפתרונות עשויים להיות טובים גם למלכות.
מתי פתרון לצריחים (כלומר תמורה) אינו טוב למלכות?
כאשר יש זוג שנמצא על אותו אלכסון!
לדוגמא במקרה הבא (פתרון טוב לצריחים!) המלכות השחורות נמצאות על אלכסון משותף.
בדיקת אלכסונים
ישנם שני סוגי אלכסונים. אלכסון "/" מדרום מערב לצפון מזרח
(sw2ne)
ואלכסון
"\"
מצפון מערב לדרום מזרח
(nw2se).
נסמן שתי משבצות על הלוח
המשבצות נמצאות על אותו אלכסון / sw2ne אם ורק אם:
המשבצות נמצאות על אותו אלכסון \ nw2se אם ורק אם:
בדוגמא שלמעלה המלכות השחורות נמצאות במשבצות:
c2, e4
שהם בסימון שלנו:
ואכן:
כלומר על אותו אלכסון / sw2ne.
בדיקת איום מלכות
בהנתן תמורה (פתרון לצריחים) בגודל n, עלינו לבדוק את כל הזוגות של המשבצות, ישנם
זוגות שכאלה.
הדוגמא בתמונה (שהיא פתרון טוב לצריחים!) מתוארת על ידי התמורה
כלומר המשבצות:
כשבודקים את כל
הזוגות נתקלים בזוג המשבצות של המלכות השחורות שלמעלה, שפוסלים את התמורה מלהיות
פתרון למלכות.
תרגילים
-
השלם תרגילים קודמים.
-
קרא היטב את הסיכום שלמעלה.
-
כתוב פונקציה
def same_diagonal(x0, y0, x1, y1):
שמקבלת 4 מספרים שמתארים שתי משבצות
ומחזירה
True
אם
המשבצות על אותו אלכסון
ומחזירה
False
אם הן לא על אותו אלכסון שכזה.
הערה: מַמֵש את הפונקציה
ללא
שימוש בקבועים:
False, True
.
-
כתוב פונקציה:
def threatless_queens(a):
שמקבלת תמורה a
(המתארת משבצות של פתרון צריחים)
ומחזירה
True
אם
אין זוג משבצות על אותו אלכסון,
ומחזירה
False
אחרת.
-
כתוב תכנית מסכמת לפתרון בעית המלכות:
התכנית תקבל כפרמטר את גודל הלוח n (מענין כמובן המקרה: n=8).
התכנית:
-
תעבור על כל התמורות.
-
תמצא את התמורות שמהוות פתרון למלכות שאינן מאימות אחת על השניה.
-
תדפיס את הפתרונות למלכות, בסימון משבצות שחמט, בעזרת הפונקציה
def rows_to_chess_str(rows)
.
חזרה לעמוד האם