בחידה הזאת צריך להגיע מהמצב ההתחלתי כמתואר למעלה למצב הסופי שגם הוא מתואר למעלה. הכללים של החידה -כל יצור אמפיבי יכול לנוע למשבצת ריקה הסמוכה אליו או לדלג מעל יצור אמפיבי אחר. צפרדעים יכולות לנוע ימינה בלבד וקרפדות יכולות לנוע שמאלה בלבד. התנועה יכולה להתבצע בשני אופנים : צפרדע יכולה לגלוש למשבצת ריקה סמוכה שנמצאת מימין בלבד ואילו קרפדות יכולות לגלוש למשבצת ריקה סמוכה לשמאל בלבד. צפרדעים וקרפדות יכולות גם לדלג, (זה כל הקטע בבחירת דו חי מהסוג הזה) כמובן כל ייצור לכיוון שמותר לו, צפרדעים רק ימינה וקרפדות רק שמאלה. הדילוג יכול להתבצע אך ורק כאשר יש בסמוך לכיוון הדילוג ייצור מסוג אחר ויש גם אחריו משבצת ריקה. כלומר, צפרדע לא יכולה לדלג מעל צפרדע וקרפדה לא יכולה לדלג מעל קרפדה (בין אם יש אחרי משבצת ריקה ובין אם לא). אי אפשר לדלג על יותר מייצור אחד (צפרדע לא יכולה לדלג מעל שתי קרפדות) ואי אפשר לדלג מעל ייצור שאין אחריו משבצת ריקה (וכל אחת כזכור רק לכיוון שהיא יודעת לדלג).
צריך לבנות תוכנית, בפייתון (כאילו בזה אנו עוסקים כאן), שתציג מודל של החידה. ותציג את שלבי הפתרון מהמצב ההתחלתי למצב הסופי שבו הצפרדעים והקרפדות מחליפות מקומות.
הראשון שיפתור עם תוכנית מרשימה יזכה בתהילת עולם (בקנה המידה המצומצם יותר של קומץ האנשים הנדירים החברים באתר הזה בפורום).
gm extractor google map data extractor google maps extractor google business extractor google map extractor google data extractor google business data extractor google extractor software google data extractor software google extractor google maps lead extractor google my business data extractor google my business extractor g maps extractor google maps data extractor google map contact extractor google maps data extractor software free download gmb data extractor google map data extrator google maps scraper seo software gm extractor google map data extractor google maps extractor google business extractor google map extractor google data extractor google business data extractor google extractor software google data extractor software google extractor google maps lead extractor google my business data extractor google my business extractor g maps extractor google maps data extractor google map contact extractor google maps data extractor software free download gmb data extractor google map data extrator google maps scraper seo software gm extractor google map data extractor google maps extractor google business extractor google map extractor google data extractor google business data extractor google extractor software google data extractor software google extractor google maps lead extractor google my business data extractor google my business extractor g maps extractor google maps data extractor google map contact extractor google maps data extractor software free download gmb data extractor google map data extrator google maps scraper seo software gm extractor google map data extractor google maps extractor google business extractor google map extractor google data extractor google business data extractor google extractor software google data extractor software google extractor google maps lead extractor google my business data extractor google my business extractor g maps extractor google maps data extractor google map contact extractor google maps data extractor software free download gmb data extractor google map data extrator google maps scraper seo software
>>>Daftar Sekarang Juga Bonus Promo 100% <<<
KLIK LINK INI UNTUK MENDAFTAR
agen slot gacor, akun bet, apk jackpot online uang asli, aplikasi rtp slot, bocoran, bocoran rtp live, bocoran slot tergacor, cara melihat rtp slot pragmatic, daftar jackpot online,akun jp, akunjp,daftar judi jackpot online, daftar judi online jackpot terbesar, download jackpot online Situs Slot PG Soft Online Deposit Pulsa Terpopuler, info slot gacor hari ini, Judi Slot PG Soft Online Deposit Pulsa, Link RTP Slot, link slot gacor, link slot winrate tertinggi, main judi online jackpot, menang jackpot slot, pola slot gacor hari ini olympus, rtp live gacor, situs slot gacor, Situs Slot PG Soft Online Via Pulsa Terbaru, SITUS SLOT RTP TERTINGGI, Situs Slot Winrate Tertinggi, SLOT GACOR, slot gacor hari ini, slot gacor malam ini, slot gacor terbaru, slot luar, slot luar negeri, Slot Online Gacor, slot paling gacor sedunia, Slot PG Soft Gacor Via Pulsa Mudah Menang, Slot PG Soft Online Pakai Pulsa Diskon Besar, slot rtp tertinggi, slot rtp tertinggi hari ini, slot server luar, slot winrate tertinggi hari ini, Slot Winrate Tinggi, trik slot olympus maxwin, server wso,akun wso slot gratis, situs wso slot online, akun wso slot pragmatic, daftar akun wso, daftar akun wso slot, akun slot wso, akun wso, akun pro olympus, situs wso, akun jp, akun pro olympus, infini88,bocoran admin,situs gacor,maxwin slot,bocoran admin,slot pulsa,olympus slot,akun pro rusia.
הפתרון שלי עובד עבור כל n צפרדעים ולוח של 2n+1 - במקרה הזה עבור 5 צפרדעים וחמש קרפדות המחליפות מקום. בפתרון שלי קרפדות מסומנות ב- 0, צפרדעים מסומנות ב- 1 והמקום הריק ב- 2-
#Toads = 0 #Frogs = 1 #Empty Place = 2 class Frogs_and_Toads: def __init__(self, n): self.n = n self.board = [0 for i in range(n)] + [2]+ [1 for i in range(n)] self.solution = [1 for i in range(n)] + [2]+ [0 for i in range(n)] self.steps = [self.board[::]] self.solve() def pm(self, board): # bc stands for board copy - a copy of the board possible_moves = [] for place, item in enumerate(board): try: if item == 0: if board[place+1] == 2: bc = board[::] bc[place] = 2 bc[place+1] = 0 possible_moves.append(bc) if item == 1: if place != 0: if board[place-1] == 2: bc = board[::] bc[place] = 2 bc[place-1] = 1 possible_moves.append(bc) except: pass if place < len(board)-2: if item == 0 and board[place+1] == 1 and board[place+2] == 2: bc = board[::] bc[place] = 2 bc[place+2] = 0 possible_moves.append(bc) if place > 1: if item == 1 and board[place-1] == 0 and board[place-2] == 2: bc = board[::] bc[place] = 2 bc[place-2] = 1 possible_moves.append(bc) return possible_moves def solve(self): if self.solution in self.steps: for item in self.steps: print(item) exit() else: for item in self.pm(self.steps[-1]): self.steps.append(item) self.solve() self.steps.pop() Frogs_and_Toads(5)
>>>
[0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 2, 0, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 1, 0, 2, 1, 1, 1, 1]
[0, 0, 0, 0, 1, 0, 1, 2, 1, 1, 1]
[0, 0, 0, 0, 1, 2, 1, 0, 1, 1, 1]
[0, 0, 0, 2, 1, 0, 1, 0, 1, 1, 1]
[0, 0, 2, 0, 1, 0, 1, 0, 1, 1, 1]
[0, 0, 1, 0, 2, 0, 1, 0, 1, 1, 1]
[0, 0, 1, 0, 1, 0, 2, 0, 1, 1, 1]
[0, 0, 1, 0, 1, 0, 1, 0, 2, 1, 1]
[0, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1]
[0, 0, 1, 0, 1, 0, 1, 2, 1, 0, 1]
[0, 0, 1, 0, 1, 2, 1, 0, 1, 0, 1]
[0, 0, 1, 2, 1, 0, 1, 0, 1, 0, 1]
[0, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1]
[2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 2, 0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 2, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2]
[1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 0]
[1, 0, 1, 0, 1, 0, 1, 2, 1, 0, 0]
[1, 0, 1, 0, 1, 2, 1, 0, 1, 0, 0]
[1, 0, 1, 2, 1, 0, 1, 0, 1, 0, 0]
[1, 2, 1, 0, 1, 0, 1, 0, 1, 0, 0]
[1, 1, 2, 0, 1, 0, 1, 0, 1, 0, 0]
[1, 1, 1, 0, 2, 0, 1, 0, 1, 0, 0]
[1, 1, 1, 0, 1, 0, 2, 0, 1, 0, 0]
[1, 1, 1, 0, 1, 0, 1, 0, 2, 0, 0]
[1, 1, 1, 0, 1, 0, 1, 2, 0, 0, 0]
[1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0]
[1, 1, 1, 2, 1, 0, 1, 0, 0, 0, 0]
[1, 1, 1, 1, 2, 0, 1, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 0, 2, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0]
הפתרון מראה את כל התהליך של החלפת המקומות בין הצפרדעים לקרפדות.
טבע ארבילי
טוב אם ניסיתם במשך כמה ימים ולא הצלחתם , הנה פתרון באמצעות מחלקה -class - וגם רקורסיה - וגם backtracking . לא פתרון של שתי שורות (למי שיש לו רעיון שידביק כאן בשמחה אני לא משלם לפי מספר העמודים באתר), אלא פתרון כזה שאפשר, אולי, ללמוד ממנו משהו - האסטרטגיה של- backtracking מחפשת את הפתרון הנכון מבין האופציות שיש בכל סיטואציה (במדריך יש אנלוגיה של עץ וענפים שזה סבבה), כאשר לא מוצאת בענף מסוים, משיבה את המצב לקדמותו וממשיכה לחפש (למשל אם הסתבר שלהזיז צפרדע לא נותן פתרון, אזי בסיבוב הבא, באותה סיטואציה, התוכנית תקפיץ קרפדה (לא לבעלי קיבה חלשה).
תחילה מקימים מחלקה בשם Creature המתאימה לכל הייצורים האמפיביים, הן צפרדעים והן קרפדות. המחלקה כוללת את הפונקציות הבאות __init__ המספרת לנו מה יש במחלקה - type הוא attribute המטפל בסוג האמפיבי שלנו, צפרדע "f" או קרפדה "t" (באנגלית toad). בהמשך location מטפלת במיקום של הייצור בביצה שלנו שהיא רשימה בשם line (האיבר הראשון משמאל הוא [line[0 כך שהמיקום של מי שנמצא שם הוא 0).
על מנת שנוכל להזיז את הייצורים יש לנו מתודות (שהן פונקציות בתוך מחלקה) כמו move , jump undo_move המותאמות לכל ייצור בנפרד. יש לנו מתודה option המתארת את אפשרות התזוזה של כל ייצור, ויש גם מתודה __repr__ כדי לייצג באופן הולם את הדרך שבה אנו רוצים לראות את הייצור כאשר נבקש להדפיס אותו למשל.
class Creature: def __init__(self,type,location,line): self.type=type self.location=location self.line=line def move(self): self.last_location=self.location if self.type=="f" and self.location<6 and self.line[self.location+1]==0: self.line[self.location+1]=self self.line[self.location]=0 self.location += 1 if self.type == "t" and self.location>0 and self.line[self.location-1]==0: self.line[self.location - 1] = self self.line[self.location] = 0 self.location -= 1 def jump(self): self.last_location = self.location if self.type == "f" and self.location<5 and self.line[self.location+1].type=="t" and self.line[self.location + 2] == 0: self.line[self.location + 2] = self self.line[self.location] = 0 self.location += 2 if self.type == "t" and self.location>1 and self.line[self.location-1].type=="f" and self.line[self.location - 2] == 0: self.line[self.location - 2] = self self.line[self.location] = 0 self.location -= 2 def option(self): option=[] if self.type == "f" and self.location<6 and self.line[self.location + 1] == 0: option.append("m") elif self.type == "t" and self.location>0 and self.line[self.location - 1] == 0: option.append("m") elif self.type == "f" and self.location<5 and self.line[self.location + 1].type == "t" and self.line[self.location + 2] == 0: option.append("j") elif self.type == "t" and self.location>1 and self.line[self.location - 1].type == "f" and self.line[self.location - 2] == 0: option.append("j") else: option.append("n") return option[-1] def undo_move(self): if self.line[self.last_location]==0: self.line[self.location]=0 self.line[self.last_location]=self self.location,self.last_location=self.last_location,self.location def __repr__(self): return f"{self.type}{self.location}" #: מכאן אנו מתחילים לייצר את המופעים של המחלקה שלנו Line=[] Line.append(Creature("f",0,Line)) Line.append(Creature("f",1,Line)) Line.append(Creature("f",2,Line)) Line.append(0) Line.append(Creature("t",4,Line)) Line.append(Creature("t",5,Line)) Line.append(Creature("t",6,Line)) #-זו פונקציה שאומרת מתי סיימנו עם החידה הזו def check_solve(line): if line[3]==0: if line[0].type=="t" and line[1].type=="t"and line[2].type=="t" and line[4].type=="f" and line[5].type=="f" and line[6].type=="f": return True # -כאן אנו מתחילים עם הפונקציה הרקורסיבית שפותרת את החידה def solve (line): l=line[::] #מתוך הרשימה אנו יוצרים אובייקט חדש ולא רק מצביע נוסף לאותה רשימה print(line) if check_solve(line): print(line,"the end") exit() else: for p,v in enumerate(l): #כאן מתחילים את האיטרציה על האובייקט החדש שהופק מהרשימה moj = 0 #זה מיועד להראות שאכן ביצענו קפיצה או תזוזה של משהו if v==0 or v.option()=="n": #כאשר אנו נתקלים ב-0 או כשאין אפשרות תזוזה ממשיכים continue z = l.index(0) #המיקום של 0 ברשימה ילמד אותנו לאן עתיד היצור לזוז if v.option()=="j": line[p].jump() moj+=1 elif v.option() == "m": line[p].move() moj += 1 solve(line) #זאת הרקורסיה בהתגלמותה if moj>0: line[z].undo_move() #כך משיבים הכל למקום כשלא הושלם הפתרון solve(Line) #כך משתמשים במחלקה שבנינו
>>>
הפתרון כתוצאה מהרצת התוכנית נראה כך -
[f0, f1, f2, 0, t4, t5, t6]
[f0, f1, 0, f3, t4, t5, t6]
[f0, 0, f2, f3, t4, t5, t6]
[0, f1, f2, f3, t4, t5, t6]
[f0, f1, t2, f3, 0, t5, t6]
[f0, f1, t2, 0, f4, t5, t6]
[f0, 0, t2, f3, f4, t5, t6]
[0, f1, t2, f3, f4, t5, t6]
[t0, f1, 0, f3, f4, t5, t6]
[t0, 0, f2, f3, f4, t5, t6]
[t0, f1, 0, f3, f4, t5, t6]
[t0, 0, f2, f3, f4, t5, t6]
[t0, f1, f2, t3, f4, 0, t6]
[t0, f1, f2, t3, 0, f5, t6]
[t0, f1, 0, t3, f4, f5, t6]
[t0, 0, f2, t3, f4, f5, t6]
[t0, t1, f2, 0, f4, f5, t6]
[t0, t1, 0, f3, f4, f5, t6]
[t0, t1, f2, 0, f4, f5, t6]
[t0, t1, 0, f3, f4, f5, t6]
[t0, t1, f2, f3, t4, f5, 0]
[t0, t1, f2, f3, t4, 0, f6]
[t0, t1, f2, 0, t4, f5, f6]
[t0, t1, 0, f3, t4, f5, f6]
[t0, t1, t2, f3, 0, f5, f6]
[t0, t1, t2, 0, f4, f5, f6]
[t0, t1, t2, 0, f4, f5, f6] the end
זו לא הדרך הקצרה ביותר, אבל זו דרך לדעת שיש פתרון לחידה שלנו.