Autorské riešenie
K tejto úlohe sa dalo pristupovať mnohými spôsobmi. Bolo možné vygenerovať všetky možné rozmiestnenia druhov v záhone a overovať, či dané rozmiestnenie je vhodné. Takisto sa dala využiť teória grafov, keď by sme predpokladali, že naše druhy sú vrcholy grafu a medzi nimi sa nachádza hrana iba ak dané druhy môžu byť v rozmiestnení vedľa seba. Potom by sa použil algoritmus pre prehľadávanie grafu do hĺbky začatý v každom vrchole grafu. Pre vzorové riešenie ukážeme riešenie "backtrackingom", teda preverovanie všetkých možností.
;Imagine
logo
viem jeVZozname :a :zoznam urobTu "poc 1 urobTu "jeVZ 0 opakuj (počet :zoznam)[ ak (:a=(prvok :poc :zoznam))[urobTu "jeVZ 1] ] výsledok :jeVZ koniec viem mozuBytSpolu :r1 :r2 :mozniSusedia výsledok (zároveň ((jeVZozname :r1 (prvok :r2 :mozniSusedia))=1) ((jeVZozname :r2 (prvok :r1 :mozniSusedia))=1)) koniec viem vytvorZáhon :plan :pozicia :mozniSusedia ak :pozicia-1 = (počet :mozniSusedia)[ píš :plan ukonči ] urobTu "rastlina 1 opakuj (počet :mozniSusedia)[ píš :rastlina urobTu "prvokPlanu prvok (:pozicia-1) :plan ak (alebo (:pozicia=1) (zároveň ((jeVZozname :rastlina :plan)=0) (mozuBytSpolu :rastlina :prvokPlanu :mozniSusedia)))[ urobTu "plan vložPo :rastlina :plan vytvorZáhon :plan (:pozicia+1) :mozniSusedia urobTu "plan bezPosledného :plan ] urobTu "rastlina :rastlina+1 ] koniec
Python
def mozuBytSpolu(r1, r2, mozniSusedia): """ Overí, či rasliny r1 a r2 možu byť susedia :param r1: prvá rastlina :param r2: druhá rastlina :param mozniSusedia: zoznam, ktorý obsahuje možných susedov pre jednotlivé druhy :return: True ak môžu byť susedia, False ak nemôžu """ return r1 in mozniSusedia[r2] and r2 in mozniSusedia[r1] def vytvorZahon(plan, pozicia, mozniSusedia): """ Rekurzívna funkcia, ktorá vygeneruje všetky možné rozmiestnenia a overí, či dané rozmiestnenie vyhovuje požiadavkam :param plan: momentálne vygenerovaný zoznam druhov :param pozicia: pozícia, na ktorú momentálne vkladáme :param mozniSusedia: zoznam, ktorý obsahuje možných susedov pre jednotlivé druhy """ if pozicia == len(mozniSusedia): print(plan) for rastlina in range(len(mozniSusedia)): if (pozicia == 0) or (rastlina not in plan and mozuBytSpolu(rastlina, plan[pozicia-1], mozniSusedia)): plan.append(rastlina) vytvorZahon(plan, pozicia+1, mozniSusedia) plan.pop() mozniSusedia = [[3],[2,3],[1],[0,1]] vytvorZahon([], 0, mozniSusedia) Vaše zaujímavé riešenia a najčastejšie chyby Odovzdané boli 2 riešenia. Jedno však, bohužiaľ, nebolo dokončené. Druhé bolo riešené spomínaným algoritmom na prehľadávanie grafu do hĺbky, čo som nepredpokladal, že niekto zo žiakov využije. V tomto riešení však nebol správny výstup pre triviálny prípad, a to ak by sme chceli vysadiť iba jeden druh rastliny.
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |