import random from collections import deque ROZMER = 5 # V zmysle, ze sachovnica ma rozmery 5x5 policok POKUSY = 5 # Pocet pokusov na vyhladanie riesenia class Uzol(): """ Definuje uzol v strome. Inak povedane stav. """ def __init__(self, policko, hlbka = 1, predkovia=set(), rodic=None): self.rodic = rodic self.policko = policko self.hlbka = hlbka self.obsadene = predkovia.copy() self.obsadene.add(policko) def __repr__(self): return "<Uzol (policko = {}, hlbka = {})>".format(self.policko, self.hlbka) def generuj_cesty(self): """ Vygeneruje mnozinu s moznymi polickami, kam sa moze kon pohnut. """ cesty = set() stlpec, riadok = self.vrat_poziciu() # hore vpravo x = stlpec + 1 y = riadok - 2 self.vytvor_cestu(x, y, cesty) # hore vlavo x = stlpec - 1 y = riadok - 2 self.vytvor_cestu(x, y, cesty) # dole vpravo x = stlpec + 1 y = riadok + 2 self.vytvor_cestu(x, y, cesty) # dole vlavo x = stlpec - 1 y = riadok + 2 self.vytvor_cestu(x, y, cesty) # vpravo hore x = stlpec + 2 y = riadok - 1 self.vytvor_cestu(x, y, cesty) # vpravo dole x = stlpec + 2 y = riadok + 1 self.vytvor_cestu(x, y, cesty) # vlavo hore x = stlpec - 2 y = riadok - 1 self.vytvor_cestu(x, y, cesty) # vlavo dole x = stlpec - 2 y = riadok + 1 self.vytvor_cestu(x, y, cesty) cesty -= self.obsadene # to iste ako cesty.difference_update(self.obsadene) # je to odcitanie mnozin return cesty def vrat_poziciu(self): """ Vypocita poziciu na sachovnici na zaklade policka. Napr. policko 21 pri rozmere 5x5, vrati x = 1, y = 5 """ x = self.policko % ROZMER y = self.policko // ROZMER + 1 #print("x = {}, y = {}".format(x, y)) return x, y def skontroluj_policko(self, x, y): """ Skontroluje, ci je policko v sachovnici. """ if (0 < x <= ROZMER) and (0 < y <= ROZMER): return True else: return False def vrat_policko(self, x, y): """ Vrati policko na zaklade x,y. Kontroluje spravnost policka. """ if self.skontroluj_policko(x, y): policko = (y - 1) * ROZMER policko += x return policko else: return None def vytvor_cestu(self, x, y, cesty): """ Ak je to mozne, vytvori cestu a zaradi ju do ciest. """ policko = self.vrat_policko(x, y) if policko is not None: cesty.add(policko) def main(): pozicia = random.randint(1, ROZMER^2) krok = 1 uzol = Uzol(pozicia) rad = deque() rad.append(uzol) try: while (krok < 100000): uzol = rad.pop() if uzol.hlbka == 25: print('Nasiel som Eurlerovho kona!') # TODO Vypisat celu cestu print(uzol) break cesty = uzol.generuj_cesty() for policko in cesty: u = Uzol(policko, uzol.hlbka + 1, uzol.obsadene, uzol) rad.append(u) krok += 1 except IndexError: print('V rade sa uz nenachadza ziaden uzol.') print('Nic som nenasiel') return if __name__ == '__main__': main()
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question