from collections import namedtuple from random import randint from keres import * from seged import * Act = namedtuple('Act', ['korong', 'rud']) # [int, str] class Hanoi(Feladat): def __init__(self, n): #hany darab korong = n super().__init__('1'*n) def célteszt(self, állapot: str): if állapot == '2'*len(állapot) or állapot == '3'*len(állapot): return True else: return False def mod(self, állapot): self.kezdő = állapot def result(self, állapot: str, act: Act): #állapot(1,1,1) -> 0 korong '2' poziciora -> (2,1,1) k,r = act #korong, rud kicsomagolasa return állapot[:k] + r + állapot[k+1:] def rákövetkező(self, állapot: str) -> list[tuple[str, tuple[int,int,int]]]: lepesek = [] f1 = állapot.find('1') # melyik az legkisebb korong az első rúdon f2 = állapot.find('2') # -1 ha nincs korong a rúdon f3 = állapot.find('3') if f1 > -1 and (f1 < f2 or f2 == -1): text = f'A {f1+1}-es korongot a 2-es rúdra' tmp = self.result(állapot, Act(f1, '2')) lepesek.append((text, tmp)) if f1 > -1 and (f1 < f3 or f3 == -1): text = f'A {f1+1}-es korongot a 3-as rúdra' tmp = self.result(állapot, Act(f1, '3')) lepesek.append((text, tmp)) if f2 > -1 and (f2 < f3 or f3 == -1): text = f'A {f2+1}-es korongot a 3-as rúdra' tmp = self.result(állapot, Act(f2, '3')) lepesek.append((text, tmp)) if f2 > -1 and (f2 < f1 or f1 == -1): text = f'A {f2+1}-es korongot a 1-es rúdra' tmp = self.result(állapot, Act(f2, '1')) lepesek.append((text, tmp)) if f3 > -1 and (f3 < f2 or f2 == -1): text = f'A {f3+1}-es korongot a 2-es rúdra' tmp = self.result(állapot, Act(f3, '2')) lepesek.append((text, tmp)) if f3 > -1 and (f3 < f1 or f1 == -1): text = f'A {f3+1}-es korongot a 1-es rúdra' tmp = self.result(állapot, Act(f3, '1')) lepesek.append((text, tmp)) return lepesek @staticmethod def érték(csucs: Csúcs): állapot = csucs.állapot n = állapot.count('1') #hany darab korong van az egyes rudon | megoldaskor 0 return n - állapot.count('2') - 2*állapot.count('3') #def útköltség(self, c, állapot1, lépés, állapot2): # #return super().útköltség(c, állapot1, lépés, állapot2) # egy = 2*(állapot1.count('1') - állapot2.count('1')) # ketto = 1.5*(állapot2.count('2') - állapot1.count('2')) # harom = 0*(állapot2.count('3') - állapot1.count('3')) # return c+ egy + ketto + harom h = Hanoi(3) print("szelessegi kereses") print(szélességi_fakeresés(h)) #print("melysegi kereses") #print(mélységi_fakeresés(h)) #print("melysegi graf") #print(mélységi_gráfkeresés(h)) print("best first") print(best_first(h, h.érték), len(best_first(h, h.érték).út()[::-1])-1) print('a*') print(a_csillag(h, h.érték), len(a_csillag(h, h.érték).út()[::-1])-1) #print(h.result('123', Act(0,'2'))) #print(h.rákövetkező('321')) #k = 0 #while h.célteszt(h.kezdő)==False: # #print(h.rákövetkező(h.kezdő)) # i=randint(0,len(h.rákövetkező(h.kezdő))-1) # lepes=h.rákövetkező(h.kezdő)[i][1] # h.mod(lepes) # #print(lepes) # k+=1 #print(k)