top of page

רעננו את הדף והקליקו למעבר לנושא הבא:

חידת 8 המלכות

Dec 10, 2018
3 min read

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

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

היות שבחידה שלנו אין יותר ממלכה אחת על כל טור וכל שורה, אנו יכולים להשתמש בפרמוטציות של שמונה מספרים 0-7 מה שיתן לנו את כל הסידורים השונים של 8 מלכות על הלוח כאשר אין יותר ממלכה אחת על כל טור או כל שורה.

נראה את התוכנית ונמשיך להסביר -

from itertools import permutations cols = range(8) for p in permutations(cols): if (len(set(p[c]+c for c in cols)) == len(set(p[c]-c for c in cols))==8): print (p)

אנו מייבאים מתוך הספריה itertools את המתודה permutations שמייצרת לנו סידורים של המספרים 0-7 במיקומים שונים בלי לחזור על אותו מספר פעמיים - משהו כזה -

(6, 2, 7, 1, 4, 0, 5, 3)

(6, 3, 1, 4, 7, 0, 2, 5)

(6, 3, 1, 7, 5, 0, 2, 4)

(6, 4, 2, 0, 5, 7, 1, 3)

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

לשם כך, צריך לחקור את הלוח וניתן לגלות עליו את הדבר הבא -












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

אם כך, מה שאנחנו מחפשים הוא פרמוטציה, permutation, של המספרים 0-7 (המייצגים 8 שורות בלוח השחמט) במיקומים כאלה על הלוח (למשל לוח האלכסונים היורדים) שכל מלכה תעמוד על משבצת בעלת מספר אחר (כלומר כל אחת על אלכסון שונה) וכך גם בלוח של האלכסונים העולים.

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

מכאן השורה בקוד -

if (len(set(p[c]+c for c in cols))== len(set(p[c]-c for c in cols))==8):

אנו רוצים שהאורך len של סט set המופעל על נוסחת האלכסונים העולים של כל מלכה יהיה שווה ל-8. כנ"ל לגבי האלכסונים היורדים. אם הסט (שאינו מכיל פעמיים את אותו המספר - המייצג אלכסון) שווה ל- 8 זה אומר שכל מלכה על אלכסון שונה. p[c]-c למשל מייצגת את נוסחת האלכסונים העולים [p[c הוא מספר השורה (מסומן בירוק בלוחות שלנו) ו- c הוא מספר הטור (מסומן בצהוב בלוחות שלנו).

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

הנה כמה מהפתרונות לחידה

  1. 0, 5, 7, 2, 6, 3, 1, 4

  2. 0, 6, 3, 5, 7, 1, 4, 2

  3. 0, 6, 4, 7, 1, 3, 5, 2

משמעות הפתרון הראשון, מלכה ראשונה בטור השמאלי ביותר בשורה 0 (שהיא השורה הראשונה), המלכה השנייה (שנייה ברשימה) בטור השני משמאל בשורה 6 (אם מתחילים מ-0 המספר 5 הוא השורה הששית) המלכה השלישית, בטור השלישי משמאל בשורה העליונה ביותר (השורה השמינית המיוצגת על ידי הספרה 7) וכו'.


 
 
 

4 Comments



andti yuma
2 days ago

https://mez.ink/garudaplay88

https://mez.ink/garudaplay.88

https://mez.ink/wau.hugo123

https://mez.ink/link.hugo123

https://mez.ink/wa.hugo123

https://mez.ink/resmi.hugo123

https://mez.ink/playwn123

https://mez.ink/linkhugo123

https://mez.ink/linkplaywin123

https://mez.ink/playwin.123

https://mez.ink/dolar.138

https://mez.ink/link.dolar138

https://mez.ink/wd.dolar138

https://mez.ink/offc.dolar138

https://mez.ink/gacor.77

https://mez.ink/gacor77indonesia

https://mez.ink/gacor77.

https://mez.ink/gacor77link

https://mez.ink/ps123

https://mez.ink/playslt123

https://mez.ink/playslot.123

https://mez.ink/sedap666

https://mez.ink/sedap.666

https://mez.ink/sedap666id

https://mez.ink/sedap666.link

https://mez.ink/larisbet.303

https://mez.ink/lrisbet303

https://mez.ink/larisbt303

https://mez.ink/lsbet303

https://mez.ink/hoki666ih

https://mez.ink/hoki6666

https://mez.ink/hokii666

https://mez.ink/pasar.88

https://mez.ink/pasar88.

https://mez.ink/psar88

https://mez.ink/pasarrr88

https://mez.ink/alam88.

https://mez.ink/alamm88

https://mez.ink/pasaar88

https://mez.ink/markisawin

https://mez.ink/markisawinofc

https://mez.ink/markisawinindonesia

https://mez.ink/markisawin1

https://mez.ink/marksiawin2

https://mez.ink/marksiawinslot

https://mez.ink/markisa.win

https://mez.ink/idrhok

https://mez.ink/idrhki

https://mez.ink/idrhokii

https://mez.ink/idrkokiii

https://mez.ink/botk123

https://mez.ink/botak123wd

https://mez.ink/btak123

https://mez.ink/botakk123

https://mez.ink/putralangit88

https://mez.ink/putralangt88

https://mez.ink/putralangitt88

https://mez.ink/putrlangit88

https://mez.ink/ptralangit88

https://mez.ink/tempoo123

https://mez.ink/tempo123news

https://mez.ink/tempo123nih

https://mez.ink/tempo123id

https://mez.ink/tempo123doloe

https://magicly.bio/linkRUPIAH777

https://mez.ink/link.rupiah777

https://mez.ink/rupiah_777

https://magicly.bio/RUPIAH_777

https://mez.ink/rp777_jos

https://mez.ink/rupiah777_indonesia

https://mez.ink/rupiah777_idn

https://mez.ink/ruph777

https://mez.ink/mimi303

https://magicly.bio/MIMI303_offc

https://magicly.bio/RTPMIMI303

https://mez.ink/mimi303official

https://mez.ink/mimi303slot

https://mez.ink/mimi303_login

https://mez.ink/mimi303_1

https://mez.ink/link_prima77

https://rupiah777.website3.me/

https://mez.ink/prim77

https://mez.ink/link.prima77

https://mez.ink/situs.prima77

https://mez.ink/situsgacorprima77

https://mez.ink/prima77.slot

https://mez.ink/lotus.303

https://mez.ink/1.lotus303

https://mez.ink/lots303

https://mez.ink/lotus303.wadidauw

https://mez.ink/web.lotus303

https://mez.ink/prda188

https://mez.ink/.prada188

https://mez.ink/1.prada188

https://mez.ink/303prada

https://mez.ink/linkmega288

https://mez.ink/km777link

https://mez.ink/pasar123nih

https://mez.ink/pasar123slot

https://mez.ink/fonix3388link

https://mez.ink/slotonlinee

https://mez.ink/sltonline

https://mez.ink/slottonline

https://mez.ink/slotagcor

https://mez.ink/fonix3388slot

https://mez.ink/arwana123

https://mez.ink/sayangbet

https://mez.ink/jago11link

https://mez.ink/angkasa189login

https://mez.ink/dewi11jp

https://mez.ink/dewi11ku

https://mez.ink/dewi11slot

https://mez.ink/dewi.11

https://mez.ink/dewil11ogin

https://mez.ink/dewi11login

https://mez.ink/situsdewi

https://mez.ink/asihoki

https://mez.ink/asiahokigacor

https://mez.ink/asiahokiii77

https://mez.ink/asiahokijos

Like

andti yuma
2 days ago

https://mez.ink/langt77

https://mez.ink/lngit77

https://mez.ink/lngt77

https://mez.ink/langitlogin

https://mez.ink/langit77ye

https://mez.ink/langit77one

https://mez.ink/langit7777

https://mez.ink/playslt77

https://mez.ink/plyslt77

https://mez.ink/playslot7

https://mez.ink/play77slott

https://mez.ink/playslot77slot

https://mez.ink/berass

https://mez.ink/beras11ku

https://mez.ink/beras11wd

https://mez.ink/berassss11

https://donidarti.website3.me/

https://mez.ink/merdek777

https://mez.ink/merdka777

https://mez.ink/mrdeka777

https://mez.ink/merdeka

https://mez.ink/merdeka777slt

https://mez.ink/merdeka777link

https://mez.ink/merdeka777one

https://datrounnifretouyuu.website3.me/

https://troittutribroubu5017.website3.me/

https://mez.ink/dewi188ind

https://mez.ink/dewi188login

https://mez.ink/dewi188ku

https://mez.ink/dewi188wd

https://mez.ink/dewi188slot

https://mez.ink/pulsa303log

https://mez.ink/pulsa303ku

https://mez.ink/pulsa303bandung

https://mez.ink/pulsa303dki

https://patritolloubesh.website3.me/

https://mez.ink/pulsa_303

https://mez.ink/link_maxwin88

https://mez.ink/maxwin88_slot

https://mez.ink/maxwin88_top

https://mez.ink/maxwin88_ind

https://mez.ink/maxwin88_gacor

https://mez.ink/slot_maxwin88

https://mez.ink/maxwn88

https://mez.ink/mxwin88

https://maxx88.website3.me/

https://mez.ink/istana_777

https://mez.ink/istan777

https://mez.ink/istana777_1

https://mez.ink/istana777_2

https://mez.ink/istana777_3

https://magic.ly/ISTANA_777

https://magic.ly/SGO_777

https://mez.ink/sgo_777

https://magic.ly/SGO777_login

https://mez.ink/sgo777_3

https://sgo777.website3.me

https://mez.ink/sgo777sl_

https://mez.ink/sgo777_gacor

https://mez.ink/sgo777_indonesia

https://mez.ink/sgo777_1

https://magic.ly/KM_777

https://mez.ink/km_777

https://magic.ly/KM777slot

https://mez.ink/km777_slt

https://km7775.website3.me/

https://magic.ly/KM777off

https://mez.ink/km777win

https://magic.ly/KM777_gas

https://mez.ink/km777_gas

https://mez.ink/km777_aman

https://mez.ink/topcer33.

https://mez.ink/abc123.

https://mez.ink/nenogym.

https://mez.ink/domba33.

https://mez.ink/posjp33.

https://mez.ink/vip33.

https://mez.ink/sip33.

https://mez.ink/ultra33

https://mez.ink/hebat33

https://mez.ink/gacor33.

https://mez.ink/to188.

https://mez.ink/royal188.

https://mez.ink/royal188slot1

https://mez.ink/tkp188wd

https://mez.ink/tkp188slot

https://mez.ink/mami188slot

https://mez.ink/ormas188slot

https://mez.ink/makaiu

https://mez.ink/barat4dwd

https://mez.ink/desta4d

https://mez.ink/gofar4d

https://mez.ink/joki4dwd

https://mez.ink/bolu4d

https://mez.ink/jaka4d

https://mez.ink/bantul4d

https://mez.ink/asu4dlogin

https://mez.ink/bangka4dwd

https://mez.ink/wa4dslot

https://mez.ink/neo4dwd

https://mez.ink/garuda138wd

https://mez.ink/badak69wd

https://mez.ink/gajah138wd

https://mez.ink/buaya138wd

https://mez.ink/harta138wd

https://mez.ink/sawer138wd

https://mez.ink/vip555dp

https://mez.ink/vip555loh

https://mez.ink/mdg188slot

https://mez.ink/mgd188login

https://mez.ink/mega188slot

https://mez.ink/mega188wd

https://mez.ink/pvjbet4

https://mez.ink/pvjbet5

https://mez.ink/pvjbet6

https://mez.ink/pvjbetmacau

https://mez.ink/pvjbetlink

https://mez.ink/pvjbetslot

https://magic.ly/pvjbet

https://mez.ink/pvj.bet

Like

Game development is a balance between creativity, technology, and player expectations. ManillaGames embraces this balance by producing engaging content about design principles, animation workflows, and modern gaming trends. We are passionate about storytelling, worldbuilding, and creating mechanics that keep players invested. Our articles and resources help beginners and experienced developers understand the logic behind successful games. From indie concepts to large-scale productions, we analyze what makes digital worlds memorable. ManillaGames is built on curiosity, experimentation, and a desire to push creative boundaries. Our goal is to transform ideas into experiences that players remember long after the credits roll.

Like
Single Post: Blog_Single_Post_Widget
bottom of page