ההסבר לקוד:
from copy import deepcopy #זה מיועד להעתקה של רשימות בתוך רשימות
Grid=[[2,3,2,1],[2,3,4,1],[1,3,5,5],[4,5,3,2],[4,1,5,4],[],[]]
#Grid זה שורת המבחנות שלנו כאשר כל מספר מייצג צבע
# 1=red, 2=purple, 3=green, 4=blue, 5= yellow
def MovePossibilities (alltubes):
"""
הפונקציה הזאת מסייעת לנו למצוא את כל האפשריות השונות להעביר כדור אחד ממבחנה אחת לאחרת
"""
g=deepcopy(alltubes)
possgrid=[] #לכאן נזרוק את כל הצירופים של זוגות מבחנות שכדורים יכולים לעבור מאחת לאחרת
grids=[] #כאן אנו אוספים את כל המציאויות (שבע מבחנות בכל מציאות) האפשריות כתוצאה ממה שלמדנו קודם
for ind,t in enumerate (g):
for i, o in enumerate(g):
if i!=ind:
if len(t) > 0 and len(o) < 4 and (len(o) == 0 or t[-1] == o[-1]):
possgrid.append([ind,i])#אנו אוספים רק את האינדקסים של המבחנות שמזיזות כדורים
for i in possgrid:
g[i[1]].append(g[i[0]].pop())
grids.append(g)#לכאן מצרפים סטים של 7 מבחנות אפשריות בכל פעם
g=deepcopy(alltubes)#זה מאפשר לאפס את התמונה על מנת שנמשיך בסדר שקבענו מראש מהמציאות הראשונה
return grids
def Complete(tube):#בודק אם מבחנה מושלמת = ריקה או עם ארבעה כדורים באותו צבע
state=0
if len(tube)==0 or (len(tube)==4 and tube[0]==tube[1]==tube[2]==tube[3]):
state=1
return state
def Check (grid):#בודק אם סט מבחנות מושלם
for tube in grid:
if Complete(tube)==1:
continue
else: return 0
return 1
glib=[] #את זה חייבים כי אחרת מקבלים אופציות שחוזרות על עצמן כדור עובר בלי סוף ממבחנה לאחרת ובחזרה
def Solve (grid):
global glib
if Check(grid):
print("Finished:")
for t in grid:
print(t)
print("Very Good!")
quit()
for g in (MovePossibilities(grid)):
if g not in glib:#זה כאמור לעיל כדי שלא יהיה לופ אינסופי של אופציות גרועות שחוזרות על עצמן בלי סוף
glib.append(g)
print(g)
Solve(g)
Solve(Grid)
"""
כך נראה החלק האחרון של הפתרון
[[5, 5, 5], [3, 3, 3, 3], [4], [5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[5, 5], [3, 3, 3, 3], [4], [5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[5], [3, 3, 3, 3], [4], [5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[], [3, 3, 3, 3], [4], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3], [3, 3, 3], [4], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3], [3, 3], [4], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3, 3], [3], [4], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3, 3, 3], [], [4], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3, 3, 3], [4], [], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3, 3], [4], [3], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3, 3], [4], [3, 3], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[3], [4], [3, 3, 3], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[], [4], [3, 3, 3, 3], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[4], [], [3, 3, 3, 3], [5, 5, 5, 5], [4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
[[], [], [3, 3, 3, 3], [5, 5, 5, 5], [4, 4, 4, 4], [1, 1, 1, 1], [2, 2, 2, 2]]
Finished:
[]
[]
[3, 3, 3, 3]
[5, 5, 5, 5]
[4, 4, 4, 4]
[1, 1, 1, 1]
[2, 2, 2, 2]
Very Good!
"""