תכנות — שיעור 95 1/October/2009    

מלכות על לוח שחמט

המשכנו בבעיה שהוצגה בשעור קודם . כפי שראינו, הפתרונות עבור צריחים שאינם "מאימים" אחד על השני מיוצגים בדיוק על ידי כל התמורות. חלק מהפתרונות עשויים להיות טובים גם למלכות.

מתי פתרון לצריחים (כלומר תמורה) אינו טוב למלכות?
כאשר יש זוג שנמצא על אותו אלכסון! לדוגמא במקרה הבא (פתרון טוב לצריחים!) המלכות השחורות נמצאות על אלכסון משותף.

בדיקת אלכסונים

ישנם שני סוגי אלכסונים. אלכסון "/" מדרום מערב לצפון מזרח (sw2ne) ואלכסון "\" מצפון מערב לדרום מזרח (nw2se). נסמן שתי משבצות על הלוח
lteq1.png
המשבצות נמצאות על אותו אלכסון / sw2ne אם ורק אם:
lteq2.png
המשבצות נמצאות על אותו אלכסון \ nw2se אם ורק אם:
lteq3.png
בדוגמא שלמעלה המלכות השחורות נמצאות במשבצות: c2, e4 שהם בסימון שלנו:
lteq4.png
ואכן:
lteq5.png
כלומר על אותו אלכסון / sw2ne.

בדיקת איום מלכות

בהנתן תמורה (פתרון לצריחים) בגודל n, עלינו לבדוק את כל הזוגות של המשבצות, ישנם

lteq6.png
זוגות שכאלה.

הדוגמא בתמונה (שהיא פתרון טוב לצריחים!) מתוארת על ידי התמורה

lteq7.png
כלומר המשבצות:
lteq8.png
כשבודקים את כל
lteq9.png
הזוגות נתקלים בזוג המשבצות של המלכות השחורות שלמעלה, שפוסלים את התמורה מלהיות פתרון למלכות.


תרגילים

  1. השלם תרגילים קודמים.
  2. קרא היטב את הסיכום שלמעלה.
  3. כתוב פונקציה
    def same_diagonal(x0, y0, x1, y1):
    שמקבלת 4 מספרים שמתארים שתי משבצות
    lteq10.png
    ומחזירה True אם המשבצות על אותו אלכסון ומחזירה False אם הן לא על אותו אלכסון שכזה.
    הערה: מַמֵש את הפונקציה ללא שימוש בקבועים: False, True .
  4. כתוב פונקציה:
    def threatless_queens(a):
    שמקבלת תמורה a (המתארת משבצות של פתרון צריחים) ומחזירה True אם אין זוג משבצות על אותו אלכסון, ומחזירה False אחרת.
  5. כתוב תכנית מסכמת לפתרון בעית המלכות: התכנית תקבל כפרמטר את גודל הלוח n (מענין כמובן המקרה: n=8). התכנית:
    חזרה לעמוד האם