Zadání semestrálního projektu Algoritmy I. zimní semestr 08/09 doc. Mgr. Jiří Dvorský, Ph.D. Verze zadání. listopadu 08 První verze Obecné pokyny. Celkem jsou k dispozici tři zadání projektů.. Každý student má přiděleno jedno zadání. Na webu předmětu Algoritmy I je zveřejněn seznam studentů a jim přiřazených zadání. Kdo by se tam případně nenašel, nechť mě neprodleně kontaktuje emailem.. Termín odevzdání je. prosince 08 :9. Tento termín je striktní, nebude dále posunován.. Projekt odevzdáváte pomocí úložiště Dropbox na URL https://www.dropbox.com/request/gcrvfeonyvjwz7uadyp. Pro odevzdání projektu není nutné mít zde založený účet.. Projekt odevzdáváte jako zip archiv s řešením (solution) pro vývojové prostředí Visual Studio 07. Jméno zip archivu bude odpovídat Vašemu loginu. Například student James Bond má login bon007, archiv se bude jmenovat bon007.zip. 6. Než projekt odešlete, vyčistěte projekt smazáním souborů vzniklých při kompilaci. Vyčištění provedete přímo ve Visual Studiu menu Build, pak Clean Solution. Takto vyčištěný projekt zabalte do zip archivu a nahrajte na Dropbox. 7. Součástí zdrojových kódů Vašeho programu bude programátorská dokumentace ve formě dokumentačních komentářů, zpracovatelných programem Doxygen, viz www.doxygen. org. Vygenerovanou dokumentaci není nutné odevzdávat, postačuje pokud Vámi odevzdaný archiv bude obsahovat konfigurační soubor doxyfile, případné adresáře pro vygenerovanou dokumentaci, vkládané obrázky atd. 8. Termíny obhajoby budou vypsány v systému Edison. 9. Řešení projektu bude hodnoceno podle následujících kritérií:
(a) správnost řešení, (b) návrh implementace (rozložení implementace do funkcí, hlavičkových a zdrojových souborů atd.), (c) styl zápisu, čitelnost, zdrojových kódů (odsazování, pojmenování proměnných, funkcí, tříd atd.) a (d) efektivita implementovaného algoritmu. Správnost řešení je podmínka nezbytná, aplikace, která nebude poskytovat správné výsledky bude hodnocena automaticky 0 body. 0. Použité zdroje je nutné správně citovat. K řešení můžete používat odbornou literaturu, učebnice, příklady zdrojových kódů z ostatních předmětů, internetové zdroje. V tom případě je nutné uvést, že Tento algoritmus jsem převzal z..., Tuto část kódu jsem převzal z.... Poznámka na závěr Úloha není tak složitá jak vypadá. Doporučuji nejprve vše pořádně rozmyslet, rozkreslit si postup rekurze, čmárat a čmárat na papír a až celou věc pochopíte, zjistíte, že jde o funkci o cca dvaceti řádcích. Čili toto zadání je delší než Váš budoucí program! Mnoho zdaru! Jiří Dvorský Smyslem tohoto kritéria není nutit Vás k implementaci nejlepšího známého algoritmu, což může být mnohdy nad Vaše síly. Úlohy můžete řešit algoritmy jednoduchými, přímočarými v tom nevidím problém. Tímto kritériem si ponechávám prostor pro případné snížení bodového hodnocení za použití algoritmu zcela nevhodného, nesmyslného.
. zadání Nalezení cesty bludištěm V tomto semestrálním projektu máte najít cestu bludištěm. Ukázkové bludiště je uvedeno na obrázku. Bludiště je sestaveno ve čtvercové síti, černé čtverečky představují zdi bludiště, bílé jsou cestičky, červený čtvereček představuje vchod do bludiště a modrý čtvereček označuje východ z bludiště. Nalezená cesta je pro ukázkové bludiště zobrazena na obrázku. V programu je bludiště zadáno čtvercovou maticí A o rozměrech N N, kde N je konstanta daná v kódu. V našem projektu je N =. Prvky matice A jsou celá čísla, reprezentuje zeď, 0 reprezentuje cestičku. Vchod a východ z bludiště nemají v matici A žádnou zvláštní hodnotu, vchod a východ jsou zadány jen souřadnicemi (,0) pro vchod a (9,0) pro východ. Cestičkami v bludišti se můžete pohybovat všemi směry: dopředu, dozadu, nahoru, dolů. Nalezenou cestu vypište na standardní výstup buď jako seznam souřadnic čtverečků, kterými prochází nalezená cesta, nebo můžete vypsat celé bludiště a cestu označit například číslem. Pokud se řešení nepodaří nalézt, ne každé bludiště musí být řešitelné, vypište o tom zprávu na standardní výstup. Poznámky Program bude pracovat z příkazového řádku, nevytvářejte žádné grafické uživatelské rozhraní. V programu stačí řešit ukázkové bludiště z tohoto zadání. Není nutné vytvářet bludiště nová. Nicméně Váš program musí být implementován tak, aby byl schopen vyřešit jakékoliv bludiště pouhou změnou matice A a konstanty N. Úlohu lze relativně snadno řešit pomocí rekurze s využitím tzv. backtrackingu. Myšlenka spočívá v tom, že jsem úspěšně provedl i tahů v bludišti a snažím se provést (i + )-ní tah. Pokud naleznu proveditelný tah, tak jej provedu. Tím jsem provedl (i + ) tahů a budu se dále snažit provést (i +)-hý tah. Jak je vidět, obě situace jsou v podstatě totožné, liší se jen množstvím již provedených tahů. Takto pokračuji dál a dál dokud nenastanou dvě možné situace:. Aktuální políčko, na kterém se nacházím je východ z bludiště. Tím je úloha vyřešena.. Z aktuálního políčka nevede žádný platný tah. V tomto případě jsem se ocitnul ve slepé uličce a jako v každém bludišti se musím vrátit o křižovatku zpět a hledat jinou cestu. V tomto případě to znamená ukončení volání funkce vykonávající i-tý tah a návrat k volání funkce pro i -ní tah. Nebo lze problém převést na graf a úlohu řešit průchodem grafu do šířky.. zadání Problém osmi dam V tomto semestrálním projektu máte vyřešit známý úkol z oblasti rekreačního šachu. Máte dánu standardní šahovnici o osmi řádcích a osmi sloupcích. Vaším úkolem je umístit na tuto šachovnici osm dam tak, aby se podle pravidel šachu vzájemně neohrožovaly. Úlohu lze zobecnit na hledání rozestavení n dam na šachovnici n n. Nicmémě, pro náš projekt stačí nalézt jedno řešení pro šachovnici 8 8. Jedno z možných řešení problému osmi dam je zobrazeno na obrázku. Celkově pro šachovnici 8 8 lze nalézt 9 řešení.
0 6 7 8 9 0 6 7 8 9 0 6 7 8 9 0 0 6 7 8 9 0 6 7 8 9 0 6 7 8 9 0 Obrázek : Ukázkové bludiště černé čtverce označují stěny bludiště, bílé jsou cestičky, červená buňka označuje vstup do bludiště, modrá východ
0 6 7 8 9 0 6 7 8 9 0 6 7 8 9 0 0 6 7 8 9 0 6 7 8 9 0 6 7 8 9 0 Obrázek : Cesta v bludišti zelené čtverečky označují nalezenou cestu
8 0Z0l0Z0Z 7 Z0Z0Z0l0 6 0ZqZ0Z0Z Z0Z0Z0Zq 0l0Z0Z0Z Z0Z0l0Z0 qz0z0z0z Z0Z0ZqZ0 a b c d e f g h Obrázek : Řešení problému osmi dam Poznámky Program bude pracovat z příkazového řádku, nevytvářejte žádné grafické uživatelské rozhraní. Pro splnění zadání stačí, pokud Váš program nalezne jedno řešení. Velikost šachovnice zadejte v programu jako konstantu ve zdrojovém kódu. Váš program by měl umět vyřešit úlohu i pro jiné velikosti šachovnice než 8 pouhou změnou této konstanty. Nalezené řešení vypište ve vhodné formě na standardní výstup. Úlohu lze relativně snadno řešit pomocí rekurze s využitím tzv. backtrackingu. Z pravidel šachu je jasné, že v každém řádku a v každém sloupci může být jen jediná dáma. Je nutné ale dořešit situaci tak, aby se dámy neohrožovaly po diagonálách. Myšlenka algoritmu řešení spočívá v tom, že se snažím postupně umisťovat dámy na další a další řádky. Mámli úspěšně umístěny dámy na řádcích až i, budu se snažit umístit dámu na řádek i + do ještě neohrožovaného sloupce. A zde mohou nastat dvě situace:. všechny sloupce jsou ohrožované tady je potřeba brát v úvahu, že šachová dáma ze své pozice ohrožuje i dvě diagonály a dámu na (i + )-ním řádku není kam umístit. Tím se řešení ocitlo ve slepé uličce a musím se vrátit o krok zpět a vyzkoušet jiné umístění dámy na řádku i nebo. nalezl jsem první neohrožovaný sloupec, umístím do něj dámu a pokračuji v řešení pro (i +)-hý řádek. Jakmile takto úspěšně umístím osmou, obecně n-tou, dámu mám úlohu vyřešenou. Než se pustíte do vývoje algoritmu, který řeší umísťování dam, rozmyslete si, jak bude ve Vašem programu reprezentovat informaci, že dané pole na šachovnici je ohrožováno nebo ne. A jak budete tuto informaci aktualizovat, když: na šachovnici přibude nová dáma a ze šachovnice byla dáma odstraněna (při návratu ze slepé uličky řešení). 6
. zadání Číselné bludiště Vaším úkolem v tomto projektu je implementace programu řešícího hru zvanou Číselné bludiště. Zadání hry tvoří čtvercová mřížka čísel, viz obrázek. Úkolem je nalézt cestu ze startu v levém horním rohu mřížky do cíle v pravém dolním rohu mřížky. Povolený tah spočívá ve skoku o tolik políček, kolik udává číslo v políčku na kterém právě stojíme. Skákat se může pouze vodorovně nebo svisle. Skok mimo mřížku samozřejmě není přípustný. Na každé políčko lze skočit právě jednou. Na obrázku nalezená cesta znázorněna zelenými šipkami. a b c d e Cíl Obrázek : Číselné bludiště Poznámky Program bude pracovat z příkazového řádku, nevytvářejte žádné grafické uživatelské rozhraní. Velikost číselného bludiště bude zadána uživatelem z příkazového řádku. Předpokládejte vždy správný vstup, rozsah povolených hodnot je od do 0. Číselné bludiště si program sám náhodně vygeneruje. Číselnou mřížku vypište na standardní výstup. A následně se pokusí toto bludiště vyřešit. Pokud program řešení úlohy nalezne, vypíše nalezenou cestu ve formě souřadnic políček přes které nalezená cesta vede. V ukázkovém případě: a, a, d, d, b, e, e. Pokud se řešení nepodaří nalézt, ne každé číselné bludiště má řešení, vypíše program na standardní výstup o tom zprávu. Úlohu lze relativně snadno řešit pomocí rekurze s využitím tzv. backtrackingu. Myšlenka spočívá v tom, že jsem úspěšně provedl i tahů v bludišti a snažím se provést (i + )-ní tah. Pokud naleznu proveditelný tah, tak jej provedu. Tím jsem provedl i + tahů a budu se dále snažit provést (i +)-hý tah. Jak je vidět, obě situace jsou v podstatě totožné, liší se jen množstvím již provedených tahů. Takto pokračuji dál a dál dokud nenastanou dvě možné situace: 7
. Aktuální políčko, na kterém se nacházím je pravý dolní roh bludiště. Tím je úloha vyřešena.. Z aktuálního políčka nevede žádný platný tah, všechny možné tahy vedou buď mimo mřížku bludiště nebo vedou na políčka, kde jsem již skákal. V tomto případě jsem se ocitnul ve slepé uličce a jako v každém bludišti se musím vrátit o křižovatku zpět a hledat jinou cestu. V tomto případě to znamená ukončení volání funkce vykonávající i-tý tah a návrat k volání funkce pro (i )-ní tah. 8