Autorské riešenie
Našou úlohou je zistiť, či pre zoznam povolení a ich predpokladov je možné získať vopred určené povolenie. Pozrime sa najskôr na to, ako zoznam povolení interpretovať. Na základe zoznamu: [['B2', 'C1', 'B1'], ['C1', 'B2'], ['C1']] vieme povedať:
Ak by sme túto úlohu riešili prakticky, bez počítača, zrejme by sme začali vybavovať (získavať) povolenia, ktoré je možné získať priamo (hľadali by sme podzoznamy, ktoré majú len jeden prvok). Ak by sme ich získali, tak zoznam povolení môžeme následne upraviť. Napr. ak získame povolenie C1, zoznam povolení môžeme upraviť nasledovne: [['B2', 'C1', 'B1'], ['C1', 'B2'], ['C1']] Ak sa v nejakom podzozname vyskytlo povolenie C1, môžeme ho z podzoznamu odstrániť - už ho nepotrebujeme získať, pretože ho už máme. Ak nejaký podzoznam obsahoval len povolenie C1, môžeme odstrániť celý podzoznam - získali sme všetky povolenia z tohto podzoznamu. Takto by sme mohli postupovať, až kým sa nám nepodarí získať vopred určené povolenie. Keďže vieme, že nie vždy je to možné, pripravíme sa aj na túto situáciu. Táto situácia nastane vtedy, ak sme vopred určené povolenie ešte nezískali a:
alebo
Výsledný program môže vyzerať nasledovne: # Python import copy def najdi_priamo_ziskatelne_povolenie(podmienky): for podmienka in podmienky: if len(podmienka) == 1: return podmienka[0] return None def uprav_podmienky(ziskane_povolenie, podmienky): for podmienka in podmienky: if ziskane_povolenie in podmienka[:-1]: podmienka.remove(ziskane_povolenie) if [ziskane_povolenie] in podmienky: podmienky.remove([ziskane_povolenie]) def da_sa_ziskat(povolenie, podmienky): podmienky = copy.deepcopy(podmienky) while podmienky: akt_povolenie = najdi_priamo_ziskatelne_povolenie(podmienky) if akt_povolenie == povolenie: return True elif akt_povolenie is None: return False uprav_podmienky(akt_povolenie, podmienky) return False Všimnime si ešte niekoľko detailov:
Vaše zaujímavé riešenia a najčastejšie chyby Väčšina z vás si s úlohou poradila. Niektorí z vás neošetrili prípady, keď pre dané vopred určené povolenie už nie sú potrebné ďalšie povolenia. Niekoľko z vás použilo rekurziu. V tomto prípade to nebolo potrebné. Oceňujeme prístup tímu Šedá eminencia dodekahedrónov, ktorý tento problém transformoval na orientovaný graf (v zmysle štruktúry s vrcholmi a hranami) a jeho prehľadávaním do hĺbky hľadal cykly. |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |